عندما تقوم بعمليات حسابية في Python باستخدام الأعداد العشرية (الأعداد ذات الأعشار)، قد تواجه أحيانًا مشكلة في الدقة العددية، وهذا ما تظهره النتيجة التي حصلت عليها. لفهم هذا الأمر بشكل أفضل، دعني أشرح لك بعض الأسباب وراء هذا السلوك الغريب.
في لغة Python (وفي العديد من لغات البرمجة الأخرى أيضًا)، يتم تمثيل الأعداد العشرية باستخدام تقريب بنيوي (binary approximation)، حيث يتم تخزين الأعداد العشرية بنظام العد الثنائي (binary) بدلاً من النظام العشري (decimal). ونتيجة لهذا التمثيل، قد تحدث بعض التقريبات التي قد تؤدي إلى فقدان الدقة في النتائج.
عند قيامك بالعملية التي ذكرتها:
165.0 + 1.45 + 0.45
يتم تحويل الأعداد إلى التمثيل الثنائي ومن ثم إجراء العمليات الحسابية. ومن الجدير بالذكر أن بعض الأعداد العشرية لا يمكن تمثيلها بدقة مطلقة في النظام الثنائي، وهذا ما يؤدي إلى الفجوة بين القيمة المتوقعة والقيمة الفعلية.
في النهاية، تظهر النتيجة 166.89999999999998 بدلاً من 166.9 بسبب عمليات التقريب التي تحدث داخل الحاسوب عند العمليات الحسابية على الأعداد العشرية. هذا يعني أنه في بعض الحالات، قد تحتاج إلى استخدام دوال مثل round() لتقريب النتائج إلى القيمة المطلوبة بدقة.
المزيد من المعلومات
بالتأكيد، دعني أضيف بعض المعلومات الإضافية لفهم أعمق لهذه الظاهرة.
-
تمثيل الأعداد العشرية في النظام الثنائي (Binary Representation): في الحواسيب، يتم تمثيل الأعداد العشرية باستخدام النظام الثنائي، حيث يتم تقسيم الجزء الصحيح والجزء العشري للعدد وتمثيلهما باستخدام أنظمة تمثيل ثنائية.
-
تقريب الأعداد العشرية (Floating Point Approximation): نظرًا لأن الأعداد العشرية غير القابلة للتمثيل بدقة مطلقة في النظام الثنائي، يتم تمثيلها باستخدام تقريبات ثنائية، مما قد يؤدي إلى فقدان الدقة في النتائج.
-
معدل الخطأ الناتج عن التقريب (Floating Point Error): تعتمد دقة النتائج على عدة عوامل، بما في ذلك عدد الأرقام الثنائية المستخدمة لتمثيل الأعداد العشرية ونوع التقريب المستخدم. يمكن أن ينتج عن هذا ما يُعرف بخطأ النقل (truncation error) وخطأ التقريب (rounding error).
-
دقة المعالج (Processor Precision): يعتمد سلوك العمليات الحسابية على دقة المعالج (processor precision) وعلى تنفيذه لعمليات الحساب الثنائي بشكل دقيق.
-
تأثير العمليات الحسابية المتتالية: قد تؤدي العمليات الحسابية المتتالية إلى تراكم الأخطاء الناتجة عن التقريب، مما يزيد من احتمالية حدوث الفجوة بين القيمة المتوقعة والقيمة الفعلية.
في النهاية، عند القيام بعمليات حسابية على الأعداد العشرية في Python، يجب أن تكون على دراية بمثل هذه الظواهر وتأثيرها على النتائج، ويمكن استخدام وظائف مثل round() لتقريب النتائج إلى الدقة المطلوبة.