أخطاء الفاصلة العائمة

2.4 أخطاء الفاصلة العائمة

أهداف التعلم

في نهاية هذا القسم، ينبغي أن تكون قادرًا على

  • شرح عدم الدقة العددية المتعلقة بتمثيل الفاصلة العائمة.
  • استخدام دالّة round() للتخفيف من أخطاء الفاصلة العائمة في الإخراج.

أخطاء الفاصلة العائمة

تخزن أجهزة الحاسوب المعلومات باستخدام الأصفار والآحاد (0 و 1). يجب تحويل جميع المعلومات إلى سلسلة من الأصفار والآحاد. مثال: يُحوَّل 5 إلى 101. وبما أنه لا يُسمح إلا بقيمتين، 0 أو 1، فإن هذا التنسيق يُسمى ثنائيًا (binary).

تُخزّن Python قيمَ الفاصلة العائمة بالصيغة الثنائية. يؤدي تحويل عدد فاصلة عائمة إلى التمثيل الثنائي الأساسي إلى أنواع محددة من أخطاء الفاصلة العائمة.

يحدث خطأ التقريب (round-off error) عندما تُخزّن قيم الفاصلة العائمة بشكل خاطئ كتقريب. يُسمى الفرق بين تقريب القيمة المستخدمة في الحساب والقيمة الصحيحة (الحقيقية) خطأ التقريب.

مثال: تخزين العدد العشري (0.1)10 ينتج عنه قيم ثنائية تُنتج فعليًا (0.1000000000000000055511151231257827021181583404541015625)10 عند تحويلها مرة أخرى، وهي ليست مساوية تمامًا لـ (0.1)10.

# طباعة الأعداد العشرية بـ 30 خانة عشرية
print(f'{0.1:.30f}') # تطبع 0.1
print(f'{0.2:.30f}') # تطبع 0.2
print(f'{0.4:.30f}') # تطبع 0.4
0.100000000000000005551115123126
0.200000000000000011102230246252
0.400000000000000022204460492503
جدول 2.1 خطأ التقريب. (يوضح المثال أعلاه سلسلة نصية مُنسَّقة (formatted string) أو سلسلة f-string، والتي تم تقديمها في فصل الكائنات.)

يحدث خطأ الفيضان (overflow error) عندما تكون القيمة أكبر من أن تُخزَّن. تتراوح قيم الفاصلة العائمة القصوى والدنيا التي يمكن تمثيلها بين 1.8×103081.8×10308 و −1.8×10308−1.8×10308 على التوالي. تؤدي محاولة تخزين قيمة فاصلة عائمة خارج النطاق (−1.8×10308,1.8×10308)(−1.8×10308,1.8×10308) إلى خطأ فيضان.

أدناه، يمكن تمثيل 3.02563.0256 و 3.05123.0512، لكن 3.010243.01024 كبير جدًا ويسبب خطأ فيضان.

print('3.0 to the power of 256 =', 3.0**256)
print('3.0 to the power of 512 = ', 3.0**512)
print('3.0 to the power of 1024 = ', 3.0**1024)
3.0 to the power of 256 = 1.3900845237714473e+122
3.0 to the power of 512 = 1.9323349832288915e+244
3.0 to the power of 1024 =
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
    print('3.0 to the power of 1024 = ', 3.0**1024)
OverflowError: (34, 'Numerical result out of range')
جدول 2.2 خطأ الفيضان.

مفاهيم تطبيقية

أخطاء الفاصلة العائمة

لكل حالة، ما الخطأ الذي يحدث؟

1.
تعليمة result = 2.0 * (10.0 ** 500) تُسند للمُتغيِّر result قيمة كبيرة جدًا.
  1. خطأ تقريب
  2. خطأ فيضان
2.
0.123456789012345678901234567890 * 0.1 تُنتج 0.012345678901234568430878013601.
  1. خطأ تقريب
  2. خطأ فيضان

دالّة round() للفاصلة العائمة

تُستخدم دالّة round() في Python لتقريب عدد فاصلة عائمة إلى عدد معين من المنازل العشرية. تتطلب الدالّة وسيطين (argument). الوسيط الأول هو العدد المراد تقريبه، أمّا الوسيط الثاني فيحدّد عدد المنازل العشرية. إذا لم يُوفَّر الوسيط الثاني، يُقرَّب العدد إلى أقرب عدد صحيح. يمكن استخدام دالّة round() للتخفيف من أخطاء الفاصلة العائمة.

مثال:

  • round(2.451, 2) = 2.45
  • round(2.451) = 2

نقطة تحقق

أمثلة على دالّة round()

مفاهيم تطبيقية

أمثلة على دالّة round()

3.
ما ناتج round(6.6)؟
  1. 6
  2. 6.6
  3. 7
4.
ما ناتج round(3.5, 2)؟
  1. 3
  2. 3.5
  3. 3.50
5.
ما ناتج round(12)؟
  1. 12.0
  2. 12
  3. 12.00
6.
ما ناتج round(0.1, 1)؟
  1. 0.1
  2. 0.10
  3. 0.1000000000000000055511151231257827021181583404541015625

جرّب بنفسك

إكراميات غير دقيقة

تحسب الشِفرة التالية مبلغ الإكرامية، بناءً على مبلغ الفاتورة ونسبة الإكرامية. جرّب مبالغ الفواتير ونسب الإكرامية التالية واكتشف ما إذا كانت هناك أي أخطاء قد تنتج عن حساب مبلغ الإكرامية.

  • مبلغ الفاتورة: 22.70 و 33.33
  • نسبة الإكرامية: 0.15، 0.18، و 0.20

جرّب بنفسك

مساحة المثلث

أكمل الخطوات التالية لحساب مساحة المثلث، واطبع نتيجة كل خطوة. مساحة المثلث هي bh2bh2، حيث b هو القاعدة و h هو الارتفاع.

  1. احسب مساحة مثلث قاعدته = 7 وارتفاعه = 3.5.
  2. قرّب مساحة المثلث إلى منزلة عشرية واحدة.
  3. قرّب مساحة المثلث إلى أقرب قيمة عدد صحيح.