لونغ دبل

في لغة C واللغات البرمجية المشابهة ، long doubleيشير مصطلح `float` إلى نوع بيانات الفاصلة العائمة الذي غالبًا ما يكون أكثر دقة من الدقة المزدوجة، على الرغم من أن معيار اللغة يشترط فقط أن يكون على الأقل بنفس دقة `float` . وكما هو الحال مع أنواع بيانات الفاصلة العائمة الأخرى في لغة C، قد لا يتوافق بالضرورة مع تنسيق IEEE .double

تاريخ

كان النوع long doubleموجودًا في معيار C الأصلي لعام 1989، [ 1 ] ولكن تم تحسين الدعم من خلال مراجعة عام 1999 لمعيار C، أو C99 ، والتي وسعت المكتبة القياسية لتشمل وظائف تعمل على long doubleمثل sinl()و strtold().

الثوابت ذات العدد العشري الطويل هي ثوابت ذات عدد عشري متبوعة بالحرف "L" أو "l" (حرف L صغير)، على سبيل المثال، 0.33333333333333333333333333333333L أو 3.1415926535897932384626433832795029L للدقة الرباعية . بدون لاحقة، يعتمد التقييم على FLT_EVAL_METHOD .

التطبيقات

في بنية x86 ، تُنفّذ معظم مُجمّعات لغة Clong double نوع البيانات ذي الدقة المُوسّعة 80 بت الذي يدعمه جهاز x86 (ويُخزّن عادةً على شكل 12 أو 16 بايت للحفاظ على محاذاة بنية البيانات )، كما هو مُحدد في معايير C99 / C11 (الحسابات العشرية IEC 60559 (الملحق F)). ويُستثنى من ذلك Microsoft Visual C++ لـ x86 (بدءًا من إصدارات 32 بت)، الذي يُقدّم long doubleمُرادفًا لـ double. [ 2 ] [ 3 ] يدعم مُجمّع Intel C++ على نظام Microsoft Windows الدقة المُوسّعة، ولكنه يتطلب أن يتوافق مفتاح التبديل الخاص بـ مع تنسيق الدقة المُوسّعة للجهاز. [ 4 ]/Qlongdoublelong double

قد تستخدم المترجمات أيضًا تنسيق الفاصلة العائمة الثنائية رباعية الدقة IEEE 754long double ( binary128). هذا هو الحال في أنظمة التشغيل HP-UX ، [ 5 ] وSolaris / SPARC ، [ 6 ] وMIPS مع واجهة التطبيق الثنائية 64 بت أو n32 ، [ 7 ] وARM 64 بت (AArch64) [ 8 ] (على أنظمة التشغيل التي تستخدم اصطلاحات استدعاء AAPCS القياسية، مثل Linux)، و z/OS مع FLOAT(IEEE) [ 9 ] [ 10 ] [ 11 ] . معظم التطبيقات برمجية، ولكن بعض المعالجات تدعمها على مستوى الأجهزة .

في بعض أنظمة PowerPC ، [ 12 ]long double يُنفَّذ كعملية حسابية مزدوجة الدقة ، حيث long doubleتُعتبر القيمة مجموعًا دقيقًا لقيمتين مزدوجتي الدقة، مما يُعطي دقة لا تقل عن 106 بت؛ وبهذا التنسيق، long doubleلا يتوافق النوع مع معيار IEEE للفاصلة العائمة . بخلاف ذلك، long doubleيُعد ببساطة مرادفًا للدقة المزدوجة، على سبيل المثال في معالجات ARMdouble ذات 32 بت ، [ 13 ] ومعالجات ARM ذات 64 بت (AArch64) (في نظامي التشغيل Windows [ 14 ] و macOS [ 15 ] ) وفي معالجات MIPS ذات 32 بت [ 16 ] (واجهة التطبيق الثنائية القديمة، المعروفة أيضًا باسم o32).

مع مُصرّف GNU C ، long doubleتكون الدقة الموسعة 80 بت على معالجات x86 بغض النظر عن وحدة التخزين الفعلية المستخدمة للنوع (والتي يمكن أن تكون إما 96 أو 128 بت)، [ 17 ] في بعض البنى الأخرى، long doubleيمكن أن تكون الدقة مزدوجة مزدوجة (مثلًا على PowerPC [ 18 ] [ 19 ] [ 20 ] ) أو دقة رباعية 128 بت (مثلًا على SPARC [ 21 ] ). بدءًا من gcc 4.3، تُدعم الدقة الرباعية أيضًا على x86، ولكن كنوع غير قياسي __float128بدلًا من long double. [ 22 ]

على الرغم من أن بنية x86، وتحديدًا تعليمات الفاصلة العائمة x87 على x86، تدعم عمليات الدقة الموسعة 80 بت، فإنه من الممكن تهيئة المعالج لتقريب ناتج العمليات التالية تلقائيًا إلى دقة مضاعفة (أو حتى دقة مفردة): الجمع، والطرح، والضرب، والقسمة، والجذر التربيعي؛ [ 23 ] أما عمليات تحميل السجلات، والقيمة المطلقة، والباقي، والتحجيم، والأس، واللوغاريتم، والعمليات المثلثية، وما إلى ذلك، فتستخدم دائمًا الدقة الموسعة 80 بت. في المقابل، في وضع الدقة الموسعة، يمكن استخدام الدقة الموسعة للحسابات الوسيطة التي يُنشئها المُصرّف حتى عندما تُخزّن النتائج النهائية بدقة أقل (أي FLT_EVAL_METHOD == 2 ). مع مُصرّف gcc على نظام Linux ، تكون الدقة الموسعة 80 بت هي الوضع الافتراضي؛ أما في العديد من أنظمة تشغيل BSD ( مثل FreeBSD و OpenBSD )، فيكون وضع الدقة المضاعفة هو الوضع الافتراضي، long doubleوتُختزل العمليات فعليًا إلى دقة مضاعفة. [ 24 ] ( مع ذلك، فإن نظام NetBSD 7.0 والإصدارات الأحدث يستخدم دقة موسعة 80 بت افتراضيًا [ 25 ] ). ومع ذلك، من الممكن تجاوز هذا الإعداد داخل برنامج فردي عبر تعليمة FLDCW "كلمة التحكم في تحميل الفاصلة العائمة". [ 24 ] على معالجات x86_64، تستخدم أنظمة BSD دقة موسعة 80 بت افتراضيًا. كما يقوم نظام Microsoft Windows مع Visual C++ بضبط المعالج على وضع الدقة المزدوجة افتراضيًا، ولكن يمكن تجاوز هذا الإعداد أيضًا داخل برنامج فردي (على سبيل المثال، باستخدام الدالة _controlfp_sفي Visual C++ [ 26 ] ). من ناحية أخرى، يُفعّل مُصرّف Intel C++ لمعالجات x86 وضع الدقة الموسعة افتراضيًا. [ 27 ] على نظام IA-32 OS X، long doubleتكون الدقة الموسعة 80 بت. [ 28 ]

مواصفات أخرى

في CORBA (من مواصفات 3.0، التي تستخدم " معيار ANSI/IEEE 754-1985 " كمرجع لها)، "يمثل نوع البيانات long double عددًا عشريًا مزدوجًا ممتدًا مزدوجًا من IEEE، والذي يحتوي على أس بطول 15 بت على الأقل وكسر موقع بطول 64 بت على الأقل"، مع GIOP/IIOP CDR، التي تتبع أنواعها العشرية "تنسيقات معيار IEEE للأعداد العشرية تمامًا"، مما يؤدي إلى تجميع هذا على أنه ما يبدو أنه IEEE 754-2008 binary128 المعروف أيضًا باسم الدقة الرباعية دون استخدام هذا الاسم.

انظر أيضاً

مراجع

  1. ANSI/ISO 9899-1990 المعيار الوطني الأمريكي للغات البرمجة - C، القسم 6.1.2.5.
  2. "Long Double" . learn.microsoft.com . 20 سبتمبر 2016. تم الاطلاع عليه بتاريخ 2022-10-06 .
  3. "نطاقات أنواع البيانات" . learn.microsoft.com . 13 يونيو 2024. تم الاطلاع عليه بتاريخ 13 أغسطس 2025 .
  4. موقع مطوري إنتل
  5. هيوليت باكارد (1992). "نقل برامج C". دليل قابلية النقل لنظام HP-UX - أجهزة كمبيوتر HP 9000 (ملف PDF) (الطبعة الثانية ). الصفحات 5-3 و5-37.  
  6. "IEEE Arithmetic" . docs.oracle.com . تم الاطلاع عليه بتاريخ 2022-10-06 .
  7. "دليل MIPSpro™ N32 ABI" (ملف PDF) . 1999. تم الاطلاع عليه بتاريخ 26-05-2020 .
  8. "معيار استدعاء الإجراءات لبنية Arm® 64 بت (AArch64)" . GitHub . 2020-10-01. مؤرشف (PDF) من الأصل في 2020-10-02.
  9. "أنواع الأعداد العشرية" . آي بي إم . 2020-10-09 . تم الاسترجاع في 2020-10-09 .
  10. شوارتز، إريك (22 يونيو 2015). "مسرعات IBM z13 SIMD للأعداد الصحيحة والسلاسل النصية والأعداد العشرية" (ملف PDF) . تم الاطلاع عليه في 13 يوليو 2015 .
  11. شوارتز، إي إم؛ كريغوفسكي، سي إيه (سبتمبر 1999). "وحدة الفاصلة العائمة S/390 G5". مجلة آي بي إم للبحوث والتطوير . 43 (5/6): 707-721 . CiteSeerX 10.1.1.117.6711 . doi : 10.1147/rd.435.0707 . 
  12. "ملحمة Power ISA 128-bit long double" . 2018-12-22 . تم الاطلاع عليه بتاريخ 2021-12-26 .
  13. "مجموعة أدوات مُترجم ARM®، مرجع المُترجم، الإصدار 5.03" (ملف PDF) . 2013. القسم 6.3 أنواع البيانات الأساسية . تم الاطلاع عليه بتاريخ 8 نوفمبر 2019 .
  14. "llvm/llvm-project" . GitHub . تم الاسترجاع في 2020-09-03 .
  15. "llvm/llvm-project" . GitHub . تم الاسترجاع في 2020-09-03 .
  16. "واجهة التطبيقات الثنائية لنظام التشغيل System V: ملحق معالج MIPS®" (ملف PDF) (الطبعة الثالثة ). 1996. تاريخ الاسترجاع: 26 مايو 2020 . 
  17. "خيارات x86 (باستخدام مجموعة مترجمات GNU (GCC))" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 2022-10-06 .
  18. "خيارات RS/6000 و PowerPC (باستخدام مجموعة مترجمات GNU (GCC))" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 2022-10-06 .
  19. داخل ماكنتوش - قسم الأرقام في باور بي سي ( مؤرشف بتاريخ 9 أكتوبر 2012 في أرشيف الإنترنت)
  20. إجراءات دعم الأعداد العشرية الطويلة ذات 128 بت لداروين
  21. "خيارات SPARC (باستخدام مجموعة مترجمات GNU (GCC))" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 2022-10-06 .
  22. "سلسلة إصدارات GCC 4.3 - التغييرات والميزات الجديدة والإصلاحات - مشروع جنو" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 2022-10-06 .
  23. "البرمجة باستخدام وحدة معالجة الفاصلة العائمة x87". دليل مطوري برامج معمارية إنتل IA-32 (ملف PDF) . إنتل. 2001. ص 8-10 . تاريخ الاسترجاع: 26-06-2026 . تؤثر بتات التحكم في الدقة فقط على نتائج تعليمات الفاصلة العائمة التالية: FADD، FADDP، FIADD، FSUB، FSUBP، FISUB، FSUBR، FSUBRP، FISUBR، FMUL، FMULP، FIMUL، FDIV، FDIVP، FIDIV، FDIVR، FDIVRP، FIDIVR، وFSQRT. 
  24. 1 2 برايان ج. جوف وريتشارد م. ستالمان، مقدمة إلى GCC ، القسم 8.6 قضايا الفاصلة العائمة (Network Theory Ltd.، 2004).
  25. "تغييرات كبيرة من NetBSD 6.0 إلى 7.0" .
  26. "وثائق Visual Studio 2005 المتوقفة" . مركز تنزيل مايكروسوفت . تم الاطلاع بتاريخ 2022-10-06 .
  27. وثائق مُجمِّع Intel C++، استخدام خيار -fp-model (/fp) .
  28. "اتفاقيات استدعاء الدوال IA-32" .