سؤال

ما هي الدقة الفعلية لـ Long Double على منصات Intel 64 بت؟ هل هو 80 بت مبطنة إلى 128 أم فعلي 128 بت؟

إذا كان السابق ، إلى جانب الذهاب إلى GMP ، هل هناك خيار آخر لتحقيق دقة 128 حقيقية؟

هل كانت مفيدة؟

المحلول

X86-64 الدقة هي نفسها X86 العادية. يبلغ طول المزدوج الممتد 80 بت ، باستخدام X87 ISA ، مع إضافة 6 بايتات حشوة. لا يوجد أجهزة FP 128 بت.

قد يستفيد تنفيذ البرمجيات من الربع أو الدقة الرباعية الممتدة من X86-64 64x64 => 128 INTEGER METEGLY تعليمات ، على الرغم من.

نصائح أخرى

أود أن أوصي باستخدام MPFR. إنها مكتبة عائمة متعددة الأطراف أكثر تطوراً تم تصميمها على قمة GMP.

هناك فرصة جيدة لأن يكون 64 بت لكليهما (اعتمادًا على المترجم ونظام التشغيل) ، لأن المترجم ينبعث منه SSE2 بدلاً من تعليمات X87.

لا يدعم X86 دقة أعلى من 80 بت ، ولكن إذا كنت بحاجة حقًا إلى أكثر من 64 بت لخوارزمية FP على الأرجح ، يجب عليك التحقق من أرقامك بدلاً من حل المشكلة مع القوة الغاشمة.

هناك بعض الخيارات.

  1. استخدم مزدوجًا لتمثيل الربع. على سبيل المثال ، انظر http://www.codeproject.com/articles/884606/the-double-double-type. ومع ذلك ، فإن النوع لا يؤكد معيار IEEE. يمكنك أن تقول من خلال فحص قيمتها Epsilon كونها أقل دقة من تعويم IEEE القياسي 128 بت وهو 1.926e-34.
  2. استخدم عوامات IEEE القياسية 128 بت. لا يوفر برنامج التحويل البرمجي Microsoft VC ++ مثل هذا النوع. يوفر برنامج التحويل البرمجي Intel C ++ نوعًا _quad ، على الرغم من أن تنفيذه غير مكتمل (لا عمليات I/O) في هذا الوقت.
  3. استخدم مكتبة الطرف الثالث. لقد قمت مؤخرًا بإنشاء مكتبة تسمى Double128 والتي تستند إلى Intel C ++ _quad ولكنها تضيف عمليات الإدخال/الإخراج. إنه يعمل مع Microsoft VC ++. يمكنك زيارة http://www.cg-inc.com/product/double128 للمزيد من المعلومات.

أوصي بأغلفة التعزيز عبر MPFR أو GMP:

Boost 1.70: CPP_BIN_FLOAT.

بالإضافة إلى الأنواع التعسفية لأي دقة مرغوبة ، يتم توفير الأنواع التالية:

cpp_bin_float_single           (24 bits + mantissa = 32 bits)
cpp_bin_float_double           (53 bits + mantissa = 64 bits)
cpp_bin_float_double_extended  (64 bits + mantissa)
cpp_bin_float_quad             (113 bits + mantissa = 128 bits)
cpp_bin_float_oct              (237 bits) + mantissa = 256 bits)

يوفر Boost وظائف خارج الصندوق تقريبًا. بمجرد التجميع ، يتعين على المرء القيام به هو إضافة مؤشر داخل مشروع Visual Studio إلى أدلة التضمين ودليل المكتبة.

تم اختباره مع Visual Studio 2017 + Boost V1.70.

نرى تعليمات لتجميع التعزيز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top