هل من الصحيح مقارنة رقمين بفاصلة عائمة مستديرة باستخدام عامل التشغيل ==؟

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

سؤال

أم أن هناك احتمال أن تفشل العملية؟

شكرًا.

لقد اخترت المصطلح الخاطئ وما قصدته حقًا هو التقريب إلى 0، وليس الاقتطاع.

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

لذلك سيكون السؤال "هل من الصحيح استخدام عامل التشغيل == لمقارنة اثنين من الثنائيات التي تم تقريبها سابقًا إلى 0، أم يجب أن ألتزم بطريقة الصب إلى int وأحصل على استثناء محتمل؟"

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

المحلول

وهنا الموقع المحدث الذي يناقش إيجابيات وسلبيات عدة طرق لمقارنة أرقام الفاصلة العائمة.(لا يزال بإمكانك مشاهدة الموقع القديم هنا.)

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

نصائح أخرى

والأسوأ من ذلك هو أنه في بعض الأحيان، حتى بالنسبة للعدد نفسه بالضبط، وسوف تفشل. وذلك لأن بعض المجمعين أو المعالجات سوف تستخدم أكثر من بت من الدقة في سجل CPU من في الذاكرة (MSVC لديه 3 خيارات مختلفة السلوك الفاصلة العائمة، على سبيل المثال). وبالتالي قد لا يكون لها قيمة حسابها مؤخرا هذه القطع اقتطاع وسوف تبدو غير متكافئة. NEVER استخدام == على عوامات.

ويمكن أن لا تزال تفشل بسبب مشاكل طبيعية مع العائمة تمثيل نقطة. بدلا من اقتطاع لهم، واستخدام دلتا التي من شأنها أن تمثل الدقة ما يعادلها.

ويمكن أن تفشل في الحالات التي لديك اثنين من العوامات التي كنت تنظر عادة نفسه،

<اقتباس فقرة>   <اقتباس فقرة>     

و10.19999999

         

و10.20000001

  

ولكن عند اقتطاع منهم أنها تعطي نتائج مختلفة.

<اقتباس فقرة>   <اقتباس فقرة>     

10.19

         

10.20

  

وحين، إذا كنت قد استخدمت دلتا 0.001 للمقارنة الفرق، وأود أن رأينا أن هاتين القيمتين بشكل فعال نفسها.

وانها لم الصحيح لاستخدام == مع الفاصلة العائمة.

وماذا تعني عبارة "اقتطاع" يعني في سياق تعويم النقطة؟ ما وظيفة محددة مكتبة يدعون لك؟ ما هي النتيجة؟ ما الذي يجعلك تعتقد أن القيم "اقتطاع" هي أي أكثر قابلية للمقارنة من القيم غير مبتورة؟

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

إذا، ومع ذلك، يمكنك تحويل إلى عدد صحيح، يمكنك استخدام ==.

إذا قيمة مطلق الخاص بك هو أقل من 2 ^ 23 للواحدة أو 2 ^ 52 لمضاعفة يمكنك استخدام الجولة () ثم قم بما مقارنة. قيم أكبر لا يمكن تخزينها precisly وهذا يفتح للحالات حيث N == N + 1.

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