ما نطاق الأرقام التي يمكن تمثيلها في أنظمة IEEE-754 ذات 16 و32 و64 بت؟

StackOverflow https://stackoverflow.com/questions/872544

سؤال

أعرف القليل عن كيفية تمثيل أرقام الفاصلة العائمة، لكن ليس بما فيه الكفاية، على ما أخشى.

السؤال العام هو:

للحصول على دقة معينة (لأغراضي، عدد المنازل العشرية الدقيقة في الأساس 10)، ما هو نطاق الأرقام التي يمكن تمثيلها لأنظمة IEEE-754 ذات 16 و32 و64 بت؟

على وجه التحديد، أنا مهتم فقط بنطاق الأرقام 16 بت و32 بت بدقة +/- 0.5 (مكان الآحاد) أو +/- 0.0005 (مكان الألف).

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

المحلول

لاجل منحه إيي-754 رقم النقطة العائمة X, ، لو

2^E <= abs(X) < 2^(E+1)

ثم المسافة من X إلى أكبر رقم عائم قابل للتمثيل (إبسيلون) يكون:

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

المعادلات المذكورة أعلاه تسمح لنا بحساب ما يلي:

  • ل نصف الدقة...

    إذا كنت تريد دقة +/- 0.5 (أو 2^-1)، فإن الحد الأقصى لحجم الرقم هو 2^10.أي أكبر من ذلك وتكون المسافة بين أرقام الفاصلة العائمة أكبر من 0.5.

    إذا كنت تريد دقة تبلغ +/- 0.0005 (حوالي 2^-11)، فإن الحد الأقصى لحجم الرقم هو 1.أي أكبر من ذلك وتكون المسافة بين أرقام الفاصلة العائمة أكبر من 0.0005.

  • ل الدقة واحد...

    إذا كنت تريد دقة +/- 0.5 (أو 2^-1)، فإن الحد الأقصى لحجم الرقم هو 2^23.أي أكبر من ذلك وتكون المسافة بين أرقام الفاصلة العائمة أكبر من 0.5.

    إذا كنت تريد دقة تبلغ +/- 0.0005 (حوالي 2^-11)، فإن الحد الأقصى لحجم الرقم هو 2^13.أي أكبر من ذلك وتكون المسافة بين أرقام الفاصلة العائمة أكبر من 0.0005.

  • ل دقة مزدوجة...

    إذا كنت تريد دقة +/- 0.5 (أو 2^-1)، فإن الحد الأقصى لحجم الرقم هو 2^52.أي أكبر من ذلك وتكون المسافة بين أرقام الفاصلة العائمة أكبر من 0.5.

    إذا كنت تريد دقة تبلغ +/- 0.0005 (حوالي 2^-11)، فإن الحد الأقصى لحجم الرقم هو 2^42.أي أكبر من ذلك وتكون المسافة بين أرقام الفاصلة العائمة أكبر من 0.0005.

نصائح أخرى

بالنسبة للأعداد الصحيحة ذات الفاصلة العائمة (سأعطي إجابتي من حيث الدقة المزدوجة لـ IEEE)، فإن كل عدد صحيح بين 1 و2^53 يمكن تمثيله تمامًا.بعد 2^53، يتم تباعد الأعداد الصحيحة التي يمكن تمثيلها تمامًا عن طريق زيادة قوى العدد اثنين.على سبيل المثال:

  • يمكن تمثيل كل عدد صحيح ثاني بين 2^53 + 2 و2^54 بدقة.
  • يمكن تمثيل كل عدد صحيح رابع بين 2^54 + 4 و2^55 بدقة.
  • يمكن تمثيل كل عدد صحيح ثامن بين 2^55 + 8 و2^56 بدقة.
  • يمكن تمثيل كل عدد صحيح رقم 16 بين 2^56 + 16 و2^57 بدقة.
  • يمكن تمثيل كل عدد صحيح رقم 32 بين 2^57 + 32 و2^58 بدقة.
  • يمكن تمثيل كل عدد صحيح رقم 64 بين 2^58 + 64 و2^59 بدقة.
  • يمكن تمثيل كل عدد صحيح 128 بين 2^59 + 128 و2^60 بدقة.
  • يمكن تمثيل كل عدد صحيح رقم 256 بين 2^60 + 256 و2^61 بدقة.
  • يمكن تمثيل كل عدد صحيح رقم 512 بين 2^61 + 512 و2^62 بدقة....

يتم تقريب الأعداد الصحيحة التي لا يمكن تمثيلها تمامًا إلى أقرب عدد صحيح يمكن تمثيله، لذا فإن أسوأ حالة تقريب هي 1/2 التباعد بين الأعداد الصحيحة القابلة للتمثيل.

والدقة نقلت صلة شكل بيتر R إلى المرجع MSDN من المحتمل ان يكون قاعدة جيدة من التجربة، ولكن بالطبع الواقع هو أكثر تعقيدا.

والحقيقة أن "نقطة" في "النقطة العائمة" هو الثنائية نقطة ونقطة لا العشرية لديه وسيلة لهزيمة حدسنا. والمثال الكلاسيكي هو 0.1، والذي يحتاج إلى دقة رقم واحد فقط في العشرية ولكن لا للتمثيل بالضبط في ثنائي على الإطلاق.

إذا كان لديك عطلة نهاية الأسبوع للقتل، إلقاء نظرة على ما كل عالم الحاسوب يجب معرفته عن العائمة نقطة الحساب . عليك ربما تكون مهتمة بشكل خاص في الأقسام على الدقة و ثنائي إلى عشري التحويل .

أولاً، لا يحتوي IEEE-754-2008 ولا -1985 على عوامات ذات 16 بت؛ولكنها إضافة مقترحة ذات أس 5 بت وكسر 10 بت.يستخدم IEE-754 بتة إشارة مخصصة، وبالتالي فإن النطاق الموجب والسالب هو نفسه.أيضًا، يحتوي الكسر على 1 ضمنيًا في المقدمة، لذا تحصل على جزء إضافي.

إذا كنت تريد الدقة في خانة الآحاد، حيث يمكنك تمثيل كل عدد صحيح، فالإجابة بسيطة إلى حد ما:يقوم الأس بنقل العلامة العشرية إلى الطرف الأيمن من الكسر.لذلك، تحصل على جزء 10 بت ±211.

إذا كنت تريد بتًا واحدًا بعد العلامة العشرية، فإنك تتخلى عن بت واحد قبلها، بحيث يكون لديك ±210.

تحتوي الدقة الفردية على جزء 23 بت، لذا سيكون لديك ±224 الأعداد الصحيحة.

يعتمد عدد بتات الدقة التي تحتاجها بعد العلامة العشرية بشكل كامل على الحسابات التي تجريها، وعدد البتات التي تجريها.

  • 210 = 1,024
  • 211 = 2,048
  • 223 = 8,388,608
  • 224 = 16,777,216
  • 253 = 9,007,199,254,740,992 (دقة مزدوجة)
  • 2113 = 10,384,593,717,069,655,257,060,992,658,440,192 (دقة رباعية)

أنظر أيضا

IEEE 754-1985 :

ملحوظة (1 + نسبة). كما bendin نشير، وذلك باستخدام نقطة عائمة الثنائية، لا يستطيعون التعبير عن العشرية بسيطة القيم مثل 0.1. وهذا يعني أنه يمكنك إدخال أخطاء التقريب عن طريق القيام اضافات بسيطة عدة مرات عديدة أو تسمية الأشياء مثل الاقتطاع. إذا كنت مهتما في أي نوع من الدقة على الإطلاق، فإن السبيل الوحيد لتحقيق ذلك هو استخدام عشري النقطة الثابتة، الذي هو في الأساس صحيحا تحجيمها.

إذا فهمت سؤالك بشكل صحيح، فإنه يعتمد على لغتك.
لC #، تحقق من في MSDN المرجع . تعويم لديه دقة 7 أرقام ومزدوجة 15-16 أرقام دقيقة.

لقد استغرق الأمر مني بعض الوقت لأكتشف أنه عند استخدام المضاعفة في Java، لم أفقد دقة كبيرة في الحسابات.تتمتع النقطة العائمة في الواقع بقدرة جيدة جدًا على تمثيل الأرقام بدقة معقولة جدًا.الدقة التي كنت أفقدها كانت فور التحويل عدد عشري الأرقام التي كتبها المستخدمون إلى الثنائية تمثيل النقطة العائمة المدعومة أصلاً.لقد بدأت مؤخرًا في تحويل جميع أرقامي إلى BigDecimal.يعد BigDecimal عملًا يجب التعامل معه في الكود أكثر بكثير من التعامل مع العوامات أو المضاعفة، نظرًا لأنه ليس أحد الأنواع البدائية.ولكن من ناحية أخرى، سأكون قادرًا على تمثيل الأرقام التي يكتبها المستخدمون بدقة.

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