في بايثون، نطاق تعويم تعتمد القيم على التنفيذ والنظام الأساسي. مواصفات لغة بايثون تتطلب ذلك فقط النقطة العائمة دعم الأرقام على الأقل 1ه-308 ل 1ه+308 بدقة لا تقل عن 53 بت .
من الناحية العملية، تستخدم معظم تطبيقات بايثون الحديثة الامتداد إيي 754 معيار النقطة العائمة، والذي يوفر نطاقًا تقريبًا 1.7e-308 ل 1.7ه+308 بدقة 53 بت . هذا النطاق هو نفسه على جميع الأنظمة الأساسية ويدعمه النوع المدمج العائم.
ومع ذلك، من المهم ملاحظة أن حساب الفاصلة العائمة يخضع لأخطاء التقريب وغيرها من مصادر عدم الدقة، خاصة عند إجراء عمليات على أرقام كبيرة جدًا أو صغيرة جدًا. يمكن أن يؤدي إلى سلوك وأخطاء غير متوقعة في بعض الحالات.
لتجنب هذه المشكلات، يوصى غالبًا باستخدامه عدد عشري أو نقطة ثابتة الحساب عند العمل مع القيم النقدية أو التطبيقات الأخرى التي تتطلب دقة عالية. ال الوحدة العشرية في Python، يوفر دعمًا لحسابات النقطة الثابتة بدقة قابلة للتكوين ويعتبر بديلاً جيدًا لحسابات الفاصلة العائمة لهذه التطبيقات.
قائمة إعدادات هاتف أندرويد
ال إيي 754 يحدد المعيار نطاق ودقة أرقام الفاصلة العائمة التي تستخدمها معظم لغات البرمجة الحديثة، بما في ذلك بايثون. يحدد المعيار تنسيقين أساسيين لأرقام الفاصلة العائمة:
يستخدم 32 بت ويوفر ما يقرب من 7 عشرية أرقام الدقة.
يستخدم 64 بت ويوفر ما يقرب من 16 عشرية أرقام الدقة.
يستخدم بايثون دقة مزدوجة أرقام الفاصلة العائمة بشكل افتراضي، مما يعني أن نطاق القيم العائمة هو تقريبًا 1.7e-308 ل 1.7ه+308 بدقة 53 بت . يتم تحديد هذا النطاق من خلال الحد الأقصى والأدنى للأسس التي يمكن تمثيلها باستخدام 11 بت ، مع الحد الأقصى والحد الأدنى من الدلالات (أي جزء الكسر من الرقم) التي يمكن تمثيلها باستخدام 52 بت .
يمكن أن تتأثر الدقة الفعلية لحساب الفاصلة العائمة بعدة عوامل، بما في ذلك طريقة تخزين الأرقام في الذاكرة، وترتيب العمليات، واختيار وضع التقريب. يمكن أن يؤدي ذلك إلى أخطاء تقريب دقيقة ومصادر أخرى لعدم الدقة في بعض الحالات.
لتجنب هذه المشكلات، يوصى غالبًا باستخدام أساليب بديلة عند العمل مع أعداد كبيرة جدًا أو صغيرة جدًا، أو عندما تكون الدقة العالية مطلوبة. على سبيل المثال:
- يستخدم حساب النقطة الثابتة أو الحساب العشري ، والذي يوفر عددًا ثابتًا من المنازل العشرية بدقة ويتجنب أخطاء التقريب.
- يستخدم الدقة التعسفية المكتبات مثل 'mpmath' أو 'gmpy2' ، والتي تتيح لك إجراء العمليات الحسابية بدقة عالية جدًا وتجنب أخطاء التقريب.
أحد الجوانب المهمة التي يجب ملاحظتها هو أنه عند إجراء عمليات حسابية على أرقام الفاصلة العائمة في بايثون، قد تواجه بعض السلوكيات غير المتوقعة بسبب الطريقة التي تعمل بها حسابات الفاصلة العائمة.
قد تؤدي بعض العمليات الحسابية إلى أرقام صغيرة جدًا أو كبيرة جدًا لا يمكن تمثيلها بدقة باستخدام حساب الفاصلة العائمة. في هذه الحالات، قد تكون النتيجة مدور أو مبتورة مما يؤدي إلى سلوك غير متوقع أو عدم دقة في حساباتك.
حساب النقطة العائمة ليس ترابطي مما يعني أن الترتيب الذي تنفذ به العمليات يمكن أن يؤثر على النتيجة. على سبيل المثال، (أ + ب) + ج قد لا يكون مساويا ل أ + (ب + ج) بسبب أخطاء التقريب وغيرها من مصادر عدم الدقة.
حساب النقطة العائمة ليس كذلك التوزيعية ، مما يعنى (أ + ب) * ج قد لا يكون مساويا ل أ * ج + ب * ج بسبب أخطاء التقريب وغيرها من مصادر عدم الدقة. لتقليل تأثير هذه المشكلات، يوصى غالبًا باستخدام وحدة الرياضيات أو المكتبات الرقمية الأخرى التي توفر وظائف لتنفيذ العمليات الحسابية على أرقام الفاصلة العائمة بطريقة أكثر دقة وموثوقية. من الممارسات الجيدة أيضًا تجنب مقارنة أرقام الفاصلة العائمة للمساواة، وبدلاً من ذلك استخدام عتبة التسامح أو طرق أخرى لمقارنة حجم الفرق بين قيمتين.
مثال:
دعونا نأخذ مثالا لإظهار كيف حساب النقطة العائمة يمكن أن يؤدي إلى سلوك غير متوقع في بيثون:
a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2)
انتاج:
0.6000000000000001 0.6
توضيح:
في هذا المثال، نقوم بإجراء عمليتين حسابيتين مختلفتين باستخدام نفس قيم أ، ب، و ج . في الحساب الأول نضيف أ و ب أولاً، ثم قم بإضافة النتيجة إلى ج . وفي الحساب الثاني نضيف ب و ج أولاً، ثم قم بإضافة النتيجة إلى أ .
قد نتوقع أن تسفر كلتا العمليتين عن نفس النتيجة، حيث أنهما يستخدمان نفس قيم أ، ب ، و ج . ومع ذلك، نظرًا للقيود المفروضة على حساب الفاصلة العائمة، فإن الحسابين ينتجان نتائج مختلفة قليلاً.
الحساب الأول ينتج نتيجة 0.6000000000000001 ، في حين أن الحساب الثاني ينتج نتيجة 0.6 . وذلك لأن النتائج المتوسطة للحساب الأول تختلف قليلاً عن النتائج المتوسطة للحساب الثاني، وذلك بسبب أخطاء التقريب ومصادر عدم الدقة الأخرى.
لتجنب هذه المشكلات، يوصى غالبًا باستخدام الوحدة العشرية أو طرق أخرى للأداء عمليات حسابية على النقطة العائمة الأرقام بطريقة أكثر دقة وموثوقية.
على سبيل المثال:
import decimal a = decimal.Decimal('0.1') b = decimal.Decimal('0.2') c = decimal.Decimal('0.3') result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2)
انتاج:
0.6 0.6
توضيح:
في هذا المثال نستخدم الوحدة العشرية لإجراء نفس الحسابات باستخدام نقطة ثابتة الحسابية بدقة 1 منزلة عشرية. فهو يسمح لنا بتجنب أخطاء التقريب وغيرها من مصادر عدم الدقة التي يمكن أن تؤثر النقطة العائمة علم الحساب. ونتيجة لذلك، فإن كلا الحسابين ينتجان نفس النتيجة 0.6 .