FreeToGenerate.com

البتات، والقيمة المضبوطة تحتها. لا يُرفع شيء.

اكتبه كما تكتبه في الشيفرة. وكل ما تحته هو ما يخزّنه الجهاز فعلًا.

وهو ما يكونه عدد جافاسكربت وعدد JSON وخلية جدول البيانات وdouble في سي.

جرّب هذه

البتات

0011111110111001100110011001100110011001100110011001100110011010
الإشارة
1
الأس
11
الكسر
52

ست عشري: 3fb999999999999a

النوع: عادي: ثمة واحد في الصدر مضمر لا يُخزَّن.

ما يُخزَّن فعلًا

ليست صورة مقرَّبة، بل القيمة بالضبط، لأن الكسر الثنائي ينتهي دائمًا في العشري.

القيمة المخزَّنة بالضبط

0.1000000000000000055511151231257827021181583404541015625

56 رقمًا

عددك ليس مخزَّنًا بالضبط، والقيمة أعلاه هي ما حصلت عليه بدلًا منه.

أنت كتبت
0.1
يُطبع هكذا
0.1

من أين تأتي

7205759403792794 × 2-56

المعنوية عدد صحيح والأس قوة صحيحة للاثنين، فالقيمة مضبوطة بحكم البناء، ولا يدخل في حسابها أي عمل بالفاصلة العائمة.

أقرب القيم الأخرى

القيم القابلة للتمثيل ليست متساوية التباعد. وهاتان هما المحيطتان بها مباشرةً، ولا شيء بينهما.

التالية أدنى
0.09999999999999999
التالية أعلى
0.10000000000000002
الفجوة إلى التالية
1.3877787807814457e-17

متوفر أيضًا بلغات أخرى: English · Español · Português · Français

محوّل الفاصلة العائمة IEEE 754

انظر إشارة أي عدد وأسّه ومعنويته، والقيمة العشرية المضبوطة التي يخزّنها الجهاز بدل المقرَّبة التي يطبعها.

ما معيار IEEE 754؟

معيار IEEE 754 هو الذي يقول كيف تخزّن الحواسيب الأعداد ذات الكسور. ويستعمله كل شيء تقريبًا: عدد جافاسكربت، وعدد JSON، وخلية جدول بيانات، وdouble في سي، وfloat في قاعدة بيانات. وبنيته ثلاثة حقول في عدد ثابت من البتات — بت إشارة، ثم أس، ثم كسر — والقيمة التي تُرمَّز هي الكسر مضروبًا في اثنين مرفوعًا إلى الأس.

ولأن الأس قوة للاثنين، فالصيغة لا تسع إلا الكسور التي مقامها قوة للاثنين. النصف والربع والثمن: مضبوطة. أما العُشر فلا، كما أن الثلث لا تنتهي كتابته العشرية. فالعدد الذي كتبته والعدد الذي حفظه الجهاز ليسا العدد نفسه في العادة، والفرق بينهما هو ما تعرضه هذه الصفحة.

وأكثر ما تغفله الأدوات هو القيمة المضبوطة. فالبرامج تطبع أعداد الفاصلة العائمة بأقصر كتابة عشرية تُقرأ رجوعًا على القيمة نفسها، فيُطبع 0.1 هكذا ويبدو سليمًا. والقيمة المخزَّنة فعلًا هي 0.1000000000000000055511151231257827021181583404541015625. وليست هذه تقريبًا للقيمة المحفوظة، بل هي القيمة المحفوظة مكتوبة بتمامها.

كيفية الاستخدام

  1. اكتب عددًا. أي شيء تكتبه في الشيفرة، ومنه الصيغة الأسية مثل 5e-324. والأزرار تغطي الحالات التي تُظهر شيئًا لافتًا.
  2. اقرأ البتات. الإشارة والأس والكسر بألوان متفرقة، والست عشري تحتها. واللوحة التالية تقول أعادي هو أم دون العادي أم صفر أم لا نهاية أم ليس عددًا.
  3. قارن ما كتبته بما يُخزَّن. تظهر القيمة العشرية المضبوطة كاملة، ومعها سطر يقول هل نجا عددك. وانتقل إلى 32 بت لترى العدد نفسه محفوظًا في نصف البتات.

لماذا لا يساوي 0.1 + 0.2 مقدارَ 0.3

هذا أول مثال يصادفه الناس، والتفسير المعتاد — أن الفاصلة العائمة غير دقيقة — صحيح لكنه يقف قبل الخطوة الأهم. فاللافت أن الأعداد الثلاثة كلها خاطئة قبل أي جمع. فبتخزينها doubles يصير 0.1 أعلى قليلًا من العُشر، و0.2 أعلى قليلًا من الخُمس، و0.3 أدنى قليلًا من ثلاثة أعشار. اكتب كلًّا منها في الأداة أعلاه لتقرأ الثلاثة.

واجمع الأولين فيكون الناتج المضبوط 0.3000000000000000444089209850062616169452667236328125. والـdouble الأقرب إلى ثلاثة أعشار قيمة أخرى، وليستا متقاربتين فحسب بل متجاورتان: لا عدد قابلًا للتمثيل بينهما البتة. فيُخطئ المجموع بأصغر مقدار تستطيع الصيغة التعبير عنه عند تلك الرتبة، وذلك كافٍ ليخرج التساوي كاذبًا.

والآلية نفسها تفسّر النصيحة التي سمعتها في شأن المال. فلا ينجو ما في مقامه عامل خمسة — عُشر، أو قرش، أو خُمس — وهو كل مبلغ يكتبه أحد. وهي كذلك سبب أن مقارنة عددين بالفاصلة العائمة بالتساوي غير موثوقة عمومًا، بينما مقارنة نصف أو ربع سليمة تمامًا.

ما تكشفه هذه الصفحة

الأعداد الصحيحة مضبوطة إلى حدٍّ ثم تنقطع. فكل عدد صحيح يُحفظ تمامًا حتى اثنين مرفوعًا إلى ثلاثة وخمسين؛ أما الذي يليه، 9007199254740993، فلا تمثيل له فيسقط على جاره، فبرنامج يعالج معرِّفات كبيرة قد يدمج اثنين منها في صمت. اكتبه أعلاه فتعيد الأداة 9007199254740992. وفي 32 بت السقف أدنى بكثير: فالعدد 16777217 لا يسع أصلًا، ويعود 16777216.

والقيم ليست متساوية التباعد. فالفجوة بين المتجاورين تتضاعف عند كل قوة للاثنين: نحو اثنين في عشرة مرفوعًا إلى سالب ستة عشر قرب الواحد، وواحدًا بالضبط عند اثنين مرفوعًا إلى اثنين وخمسين، واثنين بالضبط فوقه مباشرةً، وهي طريقة أخرى للقول إن الأعداد الفردية تكفّ عن الوجود. وبين 1 و2 توجد اثنان مرفوعًا إلى اثنين وخمسين قيمة متمايزة، وبين 2 و4 توجد المقدار نفسه موزعًا على ضعف المسافة.

والأعداد البالغة الصغر تغيّر سلوكها بدل أن تختفي. فدون أصغر قيمة عادية تتخلى الصيغة عن الواحد المضمر في الصدر وتدع الدقة تتناقص تدريجًا بدل القفز إلى الصفر. وهذه هي الأعداد دون العادية، وأصغرها اثنان مرفوعًا إلى سالب 1074، وقيمته العشرية المضبوطة 1076 محرفًا، تطبعها الأداة غير متعثرة.

وثمة صفران. فللصفر السالب نمط بتات خاص به، ويقارَن مساويًا للموجب، ويتميز عنه مع ذلك: فقسمة واحد عليه تعطي سالب لا نهاية. ولوحة البتات تُظهر الفرق الذي يخفيه اختبار التساوي.

كيف تُحقِّق من هذا، وما لا يغطّيه

القيم العشرية المضبوطة تُحسب بحساب الأعداد الصحيحة وحده: فلا تدخل الفاصلة العائمة في وصف الفاصلة العائمة، وذلك دَوْر. فالقيمة المخزَّنة معنوية صحيحة مضروبة في قوة للاثنين، وضربُ البسط والمقام في قوة الخمسة المقابلة يحوّلها إلى عشري منتهٍ، فتكون الكتابة دائمًا محدودة ودائمًا مضبوطة.

وقد قوبل كل نمط بتات وكل قيمة مضبوطة بمكتبة بايثون القياسية على أكثر من ألفي عدد تغطي المدى كله، ومنها ما دون العادي، والصفران، واللانهايتان، والأطراف. وتعطي وحدة decimal في بايثون القيمة المضبوطة للـdouble لا تقريبًا لها، فهي مرجع مضبوط لا مجرد مرجع مستقل.

وما لا يفعله: يغطي doubles بـ64 بت وfloats بـ32، لا صيغ 16 و128 بت ولا الترميزات العشرية التي يعرّفها المعيار كذلك. ويعرض التقريب إلى الأقرب، وهو الوضع الافتراضي في كل مكان والوحيد الذي تكشفه أكثر اللغات. ولا يقول شيئًا عن حمولات NaN: فالـNaN يحمل بتات قد تختلف بين العمليات، ولا شيء قابل للنقل يعتمد عليها، فتكتفي الأداة بالإفادة بأن القيمة ليست عددًا.

وإن أردت الكتابة الثنائية المضبوطة للعشري الذي كتبته أنت، لا لِما هو مخزَّن، فذاك سؤال آخر يجيب عنه محوّل الأساسات عندنا: فهو يريك العُشر كسرًا ثنائيًا يتكرر بلا نهاية. والفرق بين تلك الكتابة اللانهائية وهذه المنتهية هو بعينه خطأ التمثيل.

لماذا هي مجانية؟

هذا حساب على أعداد صحيحة يجري داخل متصفحك. فلا شيء يُشغَّل على خادم، فلا شيء يُتقاضى ولا حساب يُنشأ.

ولا يُرفع شيء مما تكتبه ولا يُخزَّن ولا يُسجَّل. فالمُدخَل عدد، وهو لا يغادر اللسان أبدًا.