سؤال

ما هو عدد صحيح "عدم العائمة" الذي يمكن تخزينه في نوع مزدوج IEEE 754 دون فقدان الدقة؟

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

المحلول

أكبر عدد صحيح في أكبر / أكبر عدد صحيح يمكن تخزينه بضغوط مزدوجة دون فقدان الدقة هو نفسه أكبر قيمة ممكنة للضغط. إنه، DBL_MAX أو حوالي 1.8 × 10308 (إذا كان لديك مزدوج هو مزدوج IEEE 754 64 بت). إنه عدد صحيح. انها ممثلة بالضبط. ماذا تريد اكثر؟

استمر، اسألني ما هو أكبر عدد صحيح، بحيث وكل الأعداد الصحيحة الأصغر يمكن تخزينه في الزوجي IEEE 64 بت دون فقدان الدقة. AEEE 64 بت مزدوجة لديه 52 بت من المانيسا، لذلك أعتقد أنه 253:

  • 253 لا يمكن تخزين + 1، لأن 1 في البداية و 1 في النهاية لديها الكثير من الأصفار بينهما.
  • أي شيء أقل من 253 يمكن تخزينها، مع تخزين 52 بت بشكل صريح في Mantissa، ثم الأسس المسموح به مما يتيح لك واحدة أخرى.
  • 253 من الواضح أنه يمكن تخزينها، لأنها قوة صغيرة من 2.

أو طريقة أخرى للنظر إليها: بمجرد إخراج التحيز من الأسهم، وتجاهل علامة بتسجيل غير ذي صلة بالمسألة، فإن القيمة المخزنة من قبل مزدوج هي قوة 2، بالإضافة إلى عدد صحيح 52 بت مضروبا في 2الأسهم - 52.. وبعد لذلك مع rogonent 52 يمكنك تخزين جميع القيم من 252 حتى 253- 1. ثم مع العرض 53، الرقم التالي يمكنك تخزينه بعد 253 هو 253 + 1 × 253 − 52. وبعد حتى فقدان الدقة يحدث أولا مع 253 + 1.

نصائح أخرى

9007199254740992 (هذا هو 9،007،199،254،740،992) دون أي ضمانات :)

برنامج

#include <math.h>
#include <stdio.h>

int main(void) {
  double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
  while (dbl + 1 != dbl) dbl++;
  printf("%.0f\n", dbl - 1);
  printf("%.0f\n", dbl);
  printf("%.0f\n", dbl + 1);
  return 0;
}

نتيجة

9007199254740991
9007199254740992
9007199254740992

WIKIPEDIA لديه هذا القول في نفس السياق مع رابط IEEE 754.:

على نظام الكمبيوتر النموذجي، يحتوي رقم النقطة العائمة الثنائية (64-بت الدقة (64 بت) مع معامل 53 بت (واحد منها ضمني)، وهو مستعرض 11 بت، وتسجيل واحد.

2 ^ 53 أكثر ما يزيد قليلا عن 9 * 10 ^ 15.

أكبر عدد صحيح يمكن تمثيله في IEEE 754 مزدوج (64 بت) هو نفس القيمة التي يمكن أن يمثلها النوع، لأن هذه القيمة هي نفسها عددا صحيحا.

هذا ممثلا 0x7FEFFFFFFFFFFFFF, ، والتي تتكون من:

  • علامة بت تسجيل (إيجابية) بدلا من 1 (سلبي)
  • الحد الأقصى للأسف 0x7FE (2046 الذي يمثل 1023 بعد طرح التحيز) بدلا من 0x7FF (2047 مما يدل على NaN أو اللانهاية).
  • الحد الأقصى للمهام 0xFFFFFFFFFFFFF وهو 52 بت الكل 1.

في ثنائي، القيمة هي الضمنية الأولى تليها 52 شخصا آخر من Mantissa، ثم 971 أصفار (1023 - 52 = 971) من الأساس.

القيمة العشرية الدقيقة هي:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

هذا ما يقرب من 1.8 × 10308.

تحتاج إلى إلقاء نظرة على حجم Mantissa. يمكن أن يمثل رقم النقطة العائمة IEEE 754 64 بت (يحتوي 52 بت، بالإضافة إلى ضمنيا) بالضبط أعداد صحيحة ذات قيمة مطلقة أقل من أو تساوي 2 ^ 53.

DECIMAL_DIG من <float.h> يجب أن تعطي تقريب معقول على الأقل لذلك. نظرا لأن هذا يتناول الأرقام العشرية، فإنه يتم تخزينه بالفعل في ثنائي، فربما يمكنك تخزين شيء ما قليل أكبر دون أن تفقد الدقة، ولكن بالضبط كم من الصعب القول. أفترض أنه يجب أن تكون قادرا على معرفة ذلك من FLT_RADIX و DBL_MANT_DIG, ، لكنني لست متأكدا من أنني كنت أثق تماما النتيجة.

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