لماذا أستخدم مكمل 2 لمقارنة الزوجين بدلاً من مقارنة فروقهما مقابل قيمة إبسيلون؟

تمت الإشارة إلى هنا و هنا ... لماذا أستخدم مكملتين على طريقة epsilon؟ يبدو أن طريقة إبسيلون ستكون جيدة بما يكفي لمعظم الحالات.


Update: I'm purely looking for a theoretical reason why you'd use one over the other. I've always used the epsilon method.

هل استخدم أحد مقارنة 2 التكميلية بنجاح؟ لماذا ا؟ لما لا؟

0
وأضاف تحرير
الآراء: 1

6 إجابة

حق أوسكار. لا تفسد هذا إلا إذا كنت حقا بحاجة إلى هذا الأداء.

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

0
وأضاف

قد تكون طريقة البت أسرع. أقول ربما لأنه في المعالجات الحديثة (متعددة النوى ، عالية الأنبوب) ، غالبا ما يكون من المستحيل تخمين ما هو أسرع حقا. رمز أبسط والأكثر وضوحا الصحيح التنفيذ ، ثم قياس ، ثم optomise.

0
وأضاف

عندما يتعلق الأمر بالسرعة ، اتبع هذه القواعد:

  1. إذا لم تكن مطورًا متمرسًا للغاية ، فلا تحسّن.
  2. إذا كنت من مطوري البرامج ذوي الخبرة ، فلا تحسّن حتى الآن.

هل أسهل طريقة.

اليكس

0
وأضاف
ما علاقة هذا بما أطلبه؟ أريد أن أعرف لماذا تستخدم طريقة واحدة على أخرى ، وليس ما إذا كنت تريد تحسين أي شيء.
وأضاف المؤلف Steve Duitsman, مصدر

يشير الرابط الثاني الذي أشرت إليه إلى مقال له وصف طويل جدًا للمشكلة:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats. هتم

ولكن ما لم تكن تعمل على تعديل الأداء ، سألتزم باستخدام epsilon حتى يتمكن الأشخاص من تصحيح شفرتك

0
وأضاف
إذن إجابة قصيرة ... الأداء أفضل بالمقارنة مع إبسيلون؟
وأضاف المؤلف Steve Duitsman, مصدر
أنا أتفق معك. إذا كان أي شيء آخر ، يجب أن تكون قابليتي الأولى هي القراءة.
وأضاف المؤلف Steve Duitsman, مصدر
لاحظ أن الأداء قد يكون أسوأ باستخدام طريقة bit-twiddling الصحيحة لأن نقل النطاقات بين النقاط العائمة والسجلات الصحيحة ليس عملية سريعة (اعتمادًا على الشريحة ومجموعة التعليمات المستخدمة). أتفادى ذلك ما لم تكن متأكدًا تمامًا من أنك تحتاج إلى أداء إضافي ، ولا يمكنك الحصول عليه (على سبيل المثال) ببساطة عن طريق اختيار epsilon مطلقة بذكاء.
وأضاف المؤلف Eamon Nerbonne, مصدر
لا اعرف لن أستخدم أي شيء معقدًا للمقارنة ما لم تكن المقارنة بين الأرقام هي الجزء الأساسي من تطبيقي. فقط تخيل الوقت speant التصحيح خطأ مطبعي بسيط ...
وأضاف المؤلف Oskar, مصدر

باختصار ، عند مقارنة طائرتين عشريتين بأصل مجهول ، يصبح اختيار إبسيلون صالحًا شبه مستحيل.

فمثلا:

ما هو epsilon جيد عند مقارنة المسافة بالأميال بين أتلانتا GA ، دالاس تكساس وبعض الأماكن في ولاية أوهايو؟

ما هو epsilon جيد عند مقارنة المسافة بالأميال بين قدمي اليسرى والقدم اليمنى والكمبيوتر تحت مكتبي؟

تعديل: </قوي>

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

مرة أخرى في الأيام القديمة من العلم ، كتبت اثنين من البرامج التي عملت مع NeverWinter Nights (لعبة من BioWare). استغرق أحد البرامج نموذج ثنائي وتحويلها إلى ASCII. استغرق البرنامج الآخر نموذج ASCII وقمت بتجميعه في ثنائي. كان أحد الاختبارات التي قمت بكتابتها هو أخذ كل نماذج BioWare الثنائية ، وفكهم إلى ASCII ثم العودة إلى ثنائي. ثم قارنت الإصدار الثنائي مع الإصدار الأصلي من BioWare. إحدى المشاكل أثناء المقارنة كانت التعامل مع بعض التباينات الطفيفة في قيم النقطة العائمة. لذا بدلاً من الخروج بمجموعة من EPSILONS مختلفة لكل نوع من رقم النقطة العائمة (قمة الرأس ، العادي ، إلخ) ، أردت استخدام شيء مثل هذا الثناء المجامل مقارنة. وبالتالي تجنب قضية EPSILON متعددة كاملة.

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

تعديل: </قوي>

LOL ، تم التصويت على هذا الأمر صعودًا ونزولًا من قبل أشخاص مختلفين.

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

كيف يمكنك مقارنة 1e23 و 1.0001e23 مع إبسيلون وما زالت تقارن 1e-23 و 5.2e-23 باستخدام نفس إبسيلون؟ بالتأكيد ، يمكنك القيام ببعض الحيل الديناميكية epsilon ، ولكن هذا هو بيت القصيد إلى مقارنة عدد صحيح (والذي لا يتطلب الأعداد الصحيحة أن تكون دقيقة).

مقارنة عدد صحيح قادرة على مقارنة عمودين باستخدام إبسيلون نسبة إلى حجم الأرقام.

تعديل </قوي>

ستيف ، دعنا ننظر إلى ما قلته في التعليقات:

"ولكنك تعرف ما تعنيه المساواة بالنسبة لك ... وبالتالي ، يجب أن تكون قادرًا على العثور على إبسيلون مناسب".

اقلب هذا البيان ليقول:

"إذا كنت تعرف معنى المساواة بالنسبة لك ، فيجب أن تتمكن من العثور على إبسيلون مناسب".

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

0
وأضاف
لكنك تعرف ما تعنيه المساواة بالنسبة لك ... ورمزك هو الشخص الذي يقارنها. ومن ثم ، يجب أن تتمكن من العثور على إبسيلون المناسب.
وأضاف المؤلف Steve Duitsman, مصدر
يعمل Epsilon في مجال المشكلة ، إذا كنت تكتب ساتناف لتحصل على من Dalls-Atlanta فإن epsilon هو عدم اليقين في نظام GPS الخاص بك
وأضاف المؤلف Martin Beckett, مصدر
هذا صحيح ، لكن وجهة نظري هي أنه عندما لا يكون لديك إطار مرجعي حول أصول العوامات ، سيكون اختيار إبسيلون صعبًا للغاية.
وأضاف المؤلف Torlack, مصدر

Using any method that compares bitwise will result in trouble when fractions are represented by approximations. All floating point numbers with fractions that are not denominated in powers of two (1/2, 1/4, 1/8, 1/65536, &c) are approximated. So, of course, are all irrational numbers.

الطفو الثالث = 1/3 ؛ تعويم اثنين = 2.0 ؛ float another_two = third * 6.0؛ إذا (اثنان! = another_two)    طباعة ("تقريب! \ n") ؛

إن الوقت الوحيد الذي يقارن بين عمل البتات هو عندما تشتق أرقام النقطة العائمة بالطريقة نفسها تمامًا أو أنها تمثل تمثيلات دقيقة (أعداد صحيحة ، صلاحيات الكسر لاثنين). حتى ذلك الحين ، يمكن أن يكون هناك تمثيل متعدد لبعض الأرقام ، على الرغم من أنني لم أر هذا في نظام العمل.

0
وأضاف
لم أكن أنا ، وهذا هو السبب في أنني أشعر بالفضول حيال ذلك.
وأضاف المؤلف Steve Duitsman, مصدر