تنسيق الفاصلة العائمة بنصف الدقة

في حوسبة، تشير **تنسيق الفاصلة العائمة بنصف الدقة** ، أو **الدقة النصفية**  (ويُشار إليها أحيانًا بـ *FP16* أو *float16*) إلى ملف ثنائي من حسابات الفاصلة المتحركة ضمن تنسيق أعداد الحاسب ويشغل معمارية 16 بت (أي بايتين في الحواسيب الحديثة) من ذاكرة حاسوب. يُستخدم هذا التنسيق لتخزين القيم ذات الفاصلة العائمة في التطبيقات التي لا تتطلب دقة عالية، لاسيما في معالجة الصور الرقمية والشبكة العصبية.

تتبع معظم الاستخدامات الحديثة معيار آي تربل إي 754 المنقح، حيث يُشار إلى تنسيق 16-بت باسم *بيناري16*، ويستخدم الأسّ 5 بتات. يمكن لهذا التنسيق التعبير عن قيم ضمن النطاق ±65,504، مع أصغر قيمة أكبر من 1 تساوي 1 + 1/1024.

اعتمادًا على الحاسوب، يمكن أن تكون الدقة النصفية أسرع بأكثر من مرتبة من حيث الأداء مقارنة بالدقة المضاعفة؛ على سبيل المثال، 550 بيتافلوبس للدقة النصفية مقابل 37&nbsp;بيتافلوبس للدقة المضاعفة على إحدى خدمات الحوسبة السحابية.

## التاريخ
ظهرت عدة تنسيقات سابقة للفاصلة العائمة بدقة 16-بت، منها تنسيق معالج الإشارات الرقمية HD61810 من شركة هيتاشي عام 1982 (يتكون من 4 بتات للأسّ و12 بتًا للقيمة الفعلية)، وتنسيق WIF لتوماس جي. سكوت عام 1991 (5 بتات للأسّ و10 بتات للقيمة الفعلية)، وتنسيق شركة ثري دي إف إكس إنترأكتف عام 1995 (بنفس مواصفات تنسيق هيتاشي).

كانت شركة إندستريال لايت آند ماجيك تبحث عن تنسيق للصور يمكنه التعامل مع نطاق ديناميكي واسع، لكن دون التكلفة العالية من حيث الذاكرة وسعة التخزين كما هو الحال في الفاصلة العائمة ذات الدقة المفردة أو المضاعفة. في عام 1997، استخدم فريق التظليل القابل للبرمجة والمعجل عتاديًا بقيادة جون إيري في شركة سيليكون غرافيكس نوع البيانات s10e5 كجزء من مشروع تصميم يُدعى "بالي". وقد وُصف ذلك في ورقة علمية نُشرت في مؤتمر *سيغراف* عام 2000 (انظر القسم 4.3) وتم توثيقه كذلك في براءة الاختراع الأمريكية رقم 7518615. وقد اكتسب هذا التنسيق شهرة من خلال استخدامه في تنسيق الصور مفتوح المصدر أوبن إكس آر.

قامت شركتا إنفيديا ومايكروسوفت بتعريف نوع البيانات *نصف* في لغة سي جي، التي أُطلقت مطلع عام 2002، وجرى تنفيذها عتاديًا في بطاقة جي فورس إف إكس الرسومية التي أُصدرت أواخر عام 2002. ومع ذلك، أزالت إنفيديا لاحقًا الدعم العتادي للفاصلة العائمة ذات 16-بت، قبل أن تعيد إدراجه في وحدة معالجة الرسومات المحمولة تيجرا عام 2015.

أُدرج امتداد *F16C* في عام 2012 لتمكين معالجات x86 من تحويل القيم ذات الدقة النصفية إلى القيم ذات الدقة المفردة وبالعكس باستخدام تعليمة آلة خاصة.

## تنسيق IEEE 754 للفاصلة العائمة النصفية الثنائية: بيناري16

يُحدد معيار IEEE 754 تنسيق **بيناري16** على النحو التالي:
* بت الإشارة: 1 بت
* عرض رفع أسي: 5 بتات
* ساينيفيكاند أو رقم ذو أهمية: 11 بت (10 بتات تُخزّن صراحةً)

يُعرض التنسيق بالشكل التالي:

ملف:IEEE 754r Half Floating Point Format.svg

يُفترض أن يكون للتنسيق خانة أولى ضمنية ذات قيمة 1، ما لم يكن حقل الأسّ مكوَّنًا بالكامل من أصفار. وبالتالي، تظهر فقط 10 بتات من ساينيفيكاند في التمثيل في الذاكرة، لكن إجمالي الدقة هو 11 بتًا. في مصطلحات IEEE 754، يوجد 10 بتات لقيمة الساينيفيكاند، لكن الدقة الإجمالية للـ ساينيفيكاند هي 11 بتًا (log10(211) ≈ 3.311 من الأرقام العشرية، أو 4 أرقام تقريبًا ± أقل قليلًا من 5 وحدات في الرقم الأخير).

### ترميز الأس
يُشفّر الأس في الفاصلة العائمة ذات الدقة النصفية باستخدام تمثيل ضارب تسلسلي، بحيث يكون الانزياح الصفري هو 15؛ ويُعرف أيضًا باسم انحياز الأس في معيار IEEE 754.
* Emin = 000012 − 011112 = −14
* Emax = 111102 − 011112 = 15
* رفع أسي = 011112 = 15

وبالتالي، كما هو معرّف في تمثيل الأعداد المنحازة، من أجل الحصول على الأس الحقيقي يجب طرح انزياح مقداره 15 من الأس المخزّن.

يُفسّر الرقمان المخزّنان 000002 و111112 بطريقة خاصة.

أصغر قيمة موجبة (شبه طبيعية) هي
2−24 ≈ 5.96 × 10−8.
أصغر قيمة موجبة مُطبَّعة هي 2−14 ≈ 6.10 × 10−5.
أكبر قيمة قابلة للتمثيل هي (2−2−10) × 215 = 65504.

### أمثلة على الدقة النصفية
تُعرض هذه الأمثلة بالتمثيل الثنائي لقيمة الفاصلة العائمة، ويتضمن ذلك بت الإشارة، والأس (المنحاز)، والأرقام ذو الأهمية.

بشكل افتراضي، يُقرّب 1/3 إلى الأسفل كما هو الحال في تنسيق الفاصلة المتحركة مزدوج الدقة، وذلك بسبب العدد الفردي للبتات في الجزء الهام. البتات بعد نقطة التقريب هي ...، وهي أقل من 1/2 من الوحدة في الخانة الأخيرة.

### القيود المتعلقة بالدقة

تُقرب القيمة 65520 وما فوق إلى اللانهاية. ينطبق هذا في حالة التقريب إلى الزوجي (round-to-even)؛ أما استراتيجيات التقريب الأخرى فقد تُغيّر هذا الحد الفاصل.

## بديل ARM للدقة النصفية
تدعم معالجات ARM (عبر خانة في سجل التحكم بالنقطة العائمة) تنسيق "بديل للدقة النصفية"، والذي يُلغي الحالة الخاصة لقيمة الأس في حالة 31 (111112).
وهو يكاد يكون مطابقًا لتنسيق IEEE، باستثناء أنه لا توجد ترميزات لللانهاية أو القيم غير الرقمية (NaNs)؛ بل يُستخدم الأس 31 لترميز الأعداد المُطبَّعة ضمن النطاق 65536 إلى 131008.

## استخدامات الدقة النصفية
تُستخدم الدقة النصفية في عدة بيئات رسوميات حاسوبية لتخزين البكسلات، بما في ذلك ماتلاب، أوبن إكس آر، JPEG XR، برنامج جنو لمعالجة الصور، مكتبة الرسوميات المفتوحة، فولكان, سي جي، دايركت ثري دي، وD3DX.
الميزة مقارنة بالأعداد الصحيحة ذات 8 أو 16 بت هي أن النطاق الديناميكي الأوسع يسمح بالحفاظ على مزيد من التفاصيل في الإضاءات والظلال في الصور، ويجنب الحاجة إلى تصحيح غاما. أما الميزة مقارنة بتنسيق النقطة العائمة ذي 32-بت الدقة الأحادية فهي تقليل استهلاك التخزين وعرض النطاق إلى النصف (على حساب الدقة والنطاق).

يمكن أن تكون الدقة النصفية مفيدة في كمّ شبكة المضلعات.
عادةً ما تُخزن بيانات الشبكة باستخدام أعداد نقطية عائمة بدقة أحادية (32-بت) للرؤوس، لكن في بعض الحالات يكون من المقبول تقليل الدقة إلى 16-بت فقط، ما يتطلب نصف مساحة التخزين مقابل بعض الخسارة في الدقة.
ويمكن أيضًا كمّ الشبكات باستخدام دقة ثابتة من 8-بت أو 16-بت حسب المتطلبات.

تميل أجهزة وبرمجيات تعلم الآلة أو الشبكة العصبية إلى استخدام الدقة النصفية: فمثل هذه التطبيقات تُجري عادةً كمًا هائلًا من العمليات الحسابية، لكنها لا تتطلب دقة عالية.
ونظرًا لأن الأجهزة لا تدعم عادةً الأعداد العائمة بدقة نصفية (16-بت)، تستخدم الشبكات العصبية غالبًا تنسيق bfloat16، وهو تنسيق النقطة العائمة ذي الدقة الأحادية بعد تقطيعه إلى 16-بت.

إذا كانت العتاديات تحتوي على تعليمات لمعالجة العمليات الحسابية بدقة نصفية، فإنها غالبًا ما تكون أسرع من الدقة الأحادية أو المضاعفة. وإذا كان النظام يدعم تعليمات تعليمات وحيدة بيانات متعددة التي تتعامل مع عدة أعداد عائمة في تعليمة واحدة، فإن الدقة النصفية قد تكون أسرع بمرتين من خلال معالجة عدد مضاعف من القيم في آنٍ واحد.

## دعم لغات البرمجة
تدعم زيغ الدقة النصفية عبر النوع `f16`.

أدخلت نواة دوت نت الإصدار 5 دعم الأعداد العائمة ذات الدقة النصفية عبر نوع المكتبة القياسية `System.Half`. اعتبارا من يناير 2024، لا توجد لغة من لغات .نت مثل سي شارب، إف شارب، فيجوال بيسك دوت نت، وسي++ تحتوي على ثابت عددي لهذا النوع (مثلًا في C#، `1.0f` يكون من نوع `System.Single` أو `1.0m` من نوع `System.Decimal`) أو على كلمة مفتاحية مخصصة له.

أدخلت سويفت الأعداد العائمة ذات الدقة النصفية في سويفت 5.3 باستخدام النوع <code>Float16</code>.

أوبن سي أل يدعم أيضًا الأعداد العائمة بنصف الدقة باستخدام نوع البيانات half وفقًا لتنسيق التخزين نصف الدقة IEEE 754-2008.

، تعمل رست (لغة برمجة) حاليًا على إضافة نوع جديد `f16` لأعداد الفاصلة العائمة بنصف الدقة 16-بت وفق معيار IEEE.

توفر جوليا (لغة برمجة) دعمًا للأعداد العائمة بنصف الدقة باستخدام النوع `Float16`.

قدم سي++ دعمًا لنصف الدقة منذ معيار C++23 مع النوع `std::float16_t`. وتقوم مجموعة مصرفات جنو بتنفيذ الدعم له بالفعل.

## دعم الأجهزة
تدعم عدة نسخ من معمارية آرم نصف الدقة.

يتم تحديد دعم التحويلات باستخدام أعداد نصف الدقة في إكس 86 مجموعة تعليمات ضمن امتداد مجموعة التعليمات F16C، والذي تم تقديمه لأول مرة عام 2009 من قبل AMD وتبناه بشكل واسع معالجات AMD وIntel بحلول 2012. وتم توسيع هذا الدعم لاحقًا ضمن امتداد مجموعة تعليمات *AVX-512_FP16* الذي نُفذ في معالج سافير رابيدز من إنتل.

في ريسك-فايف، توفر تعليمات `Zfh` و`Zfhmin` دعمًا للأجهزة لأعداد نصف الدقة 16-بت. وتمثل `Zfhmin` امتدادًا بديلاً مصغرًا لـ`Zfh`.

على باور آي إس أيه، توفر في إس إكس وامتداد SVP64 (غير الموافق عليه بعد) دعمًا للأعداد العائمة نصف الدقة 16-بت ابتداءً من PowerISA v3.1B وما بعدها.

يدعم آي بي إم زد نصف الدقة ضمن مرفق معالجة الشبكات العصبية الذي قدمته شركة آي بي إم مع معالج تيلوم. وتسمي IBM بيانات الأعداد العائمة بنصف الدقة NNP-Data-Type 1 (16-بت).

## انظر أيضًا
* أي إي إي إي 754: المعيار IEEE لعمليات الأعداد العائمة
* أنواع البيانات الأولية

## المراجع

## قراءة إضافية
* تنسيق الأعداد العائمة 16-بت الموقع الرسمي لـ Khronos Vulkan

## وصلات خارجية
* Minifloats (في *Survey of Floating-Point Formats*)
* موقع OpenEXR
* [ثوابت نصف الدقة](https://technet.microsoft.com/en-us/library/bb147247(v=vs.85).aspx) من دي ثري دي إكس
* معالجة نصف الدقة في OpenGL
* تحويلات سريعة للأعداد نصف الدقة
* نسخة Analog Devices (أسس بأربع بتات)
* كود مصدر C للتحويل بين الدقة المزدوجة، المفردة، ونصف الدقة وفق IEEE
* كود Java للتحويل بين الأعداد العائمة نصف الدقة
* نصف الدقة كميزة موسعة في GCC

تصنيف:حسابيات ثنائية