फ्लोट्स की तुलना करते समय, आप अंतर की दहलीज को क्या कहते हैं?


10

मैं अभी जावा में फ्लोट्स की तुलना कर रहा हूं और सबसे सरल सूत्र है:

Math.abs(a - b) < THRESHOLD

अंतर की दहलीज के लिए अपने चर का नामकरण करते समय, क्या आपको इसे डेल्टा या एप्सिलॉन नाम देना चाहिए ? विशेष रूप से, दोनों में से कौन सा सबसे छोटे मूल्य के लिए सही शब्द है जो एक फ्लोटिंग-पॉइंट संख्या का प्रतिनिधित्व कर सकता है?

क्या शब्द प्रोग्रामिंग भाषा विशिष्ट है, या यह भाषाओं में सार्वभौमिक है?


1
वैकल्पिक शब्द: "परिशुद्धता", "रिज़ॉल्यूशन"। मुझे ये ठीक लगता है;) क्योंकि वे अधिक तकनीकी ध्वनि नहीं करते हैं।
स्टेक्सएक्स

1
ऑफ-टॉपिक: फ्लोटिंग-पॉइंट गाइड इस प्रकार के निकट-समानता तुलना का उपयोग करने के खिलाफ सिफारिश करता है ।
स्टेक्स

1
@stakx - आपके द्वारा सुझाए गए शब्द गलत हैं और ओपी के बारे में जो पूछ रहे हैं उससे अलग अर्थ हैं। सवाल विस्तृत है, हाँ, लेकिन यह है बाहरी संदर्भ के आधार पर प्रति जवाबदेह है और यह जब चल बिन्दु मूल्यों के साथ काम कर प्रोग्रामिंग करने के लिए प्रासंगिक है। यह रचनात्मक और विषय है।

1
@ GlenH7: मैंने कभी नहीं कहा कि सवाल अच्छा नहीं था, या जवाब देने योग्य नहीं था। वास्तव में, मैं ही था जिसने इसे उकेरा। और जब से आप दावा कर रहे हैं कि (आमतौर पर कम सटीक) शब्द जो मैंने सुझाए हैं, वे गलत हैं, तो मुझे यह जानने में दिलचस्पी होगी कि ऐसा क्यों है।
स्टैकएक्स

@stakx - आप को बंद करने के लिए मतदान करने के लिए क्षमा याचना। मैं इस समय सवाल पर चार करीबी वोटों पर अधिक प्रतिक्रिया दे रहा था।

जवाबों:


18

गणित और इंजीनियरिंग में एप्सिलॉन

सामान्य रूप से गणित और इंजीनियरिंग में:

  • डेल्टा का उपयोग आम तौर पर एक अंतर को संदर्भित करने के लिए किया जाता है, जो किसी भी पैमाने का हो सकता है।
  • एप्सिलॉन का उपयोग आमतौर पर एक नगण्य मात्रा को संदर्भित करने के लिए किया जाता है।

और एप्सिलॉन आपके मामले में अधिक उपयुक्त लगता है।


कंप्यूटर विज्ञान में एप्सिलॉन

विशेष रूप से कंप्यूटर विज्ञान में, एप्सिलॉन शब्द का अर्थ मशीन एस्पिलॉन से है जो 1.0fकि सबसे छोटे फ्लोट के बीच के अंतर को मापता है और जो कि सख्ती से बड़ा होता है 1.0f। वह बाद वाली संख्या 1.00000011920928955078125fजावा में तैरने के लिए है और इसकी गणना निम्न के साथ की जा सकती है:

float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);

मशीन एप्सिलॉन की परिभाषा ऊपर वर्णित एप्सिलॉन के सामान्य उपयोग के अनुरूप है।


तुलना तैर रही है

हालांकि ध्यान दें कि "निकटता" के लिए फ्लोट्स की तुलना करने से पहले, आपको उनके पैमाने का अंदाजा होना चाहिए। दो बहुत बड़े और माना जाता है कि बहुत अलग फ्लोट समान हो सकते हैं:

9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!

और इसके विपरीत, दो छोटे फ़्लोटों के बीच कई संभावित फ्लोट मान (और परिमाण के कई आदेश) हो सकते हैं जो मशीन केवल "एप्सिलॉन" द्वारा भिन्न होते हैं। नीचे दिए गए उदाहरण में, वहाँ के बीच 10,000,000 उपलब्ध नाव मान हैं smallऔर f, लेकिन उनके अंतर अभी भी अच्छी तरह से मशीन एप्सिलॉन नीचे है:

float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!

GlenH7 के उत्तर से जुड़ा लेख फ्लोट तुलना की जांच करता है और इन मुद्दों को दूर करने के लिए कई समाधान प्रस्तावित करता है।


2
-1: वैज्ञानिक कम्प्यूटेशनल सॉफ्टवेयर में, एप्सिलॉन या तो मशीन एप्सिलॉन या सापेक्ष एप्सिलॉन (अन्य लेख देखें) को संदर्भित करता है । आमतौर पर, यह एक ही है, लगभग समानता को स्वीकार करने में प्रयोग किया जाता है क्योंकि गोलाई त्रुटियाँ हैं मात्रा नहीं है गुणकों मशीन epsilons या रिश्तेदार epsilons की, और विशिष्ट रूप से उस से भी बड़ा परिमाण के कुछ ही आदेश।
19

1
@rwong यह एप्सिलॉन शब्द की एक विशेषता है , और कई अन्य हैं। सामान्य तौर पर इंजीनियरिंग में, एप्सिलॉन एक छोटी मात्रा या एक त्रुटि का उल्लेख करता है और मशीन एप्सिलॉन उस विचार के साथ संगत है।
अक्शिलिअस 8'13

@assylias, एक ऐसे नाम का उपयोग कर रहा है जिसकी मानक परिभाषा है, एक संदर्भ में जहां मानक परिभाषा समझ में आती है, लेकिन ऐसी चीज के लिए जो मानक परिभाषा के अनुरूप नहीं है, समस्याओं के लिए एक रसीद है।
एपीग्रामग्राम

@AProgrammer मैं असहमत हूं कि एप्सिलॉन की सामान्य परिभाषा कंप्यूटिंग पर लागू नहीं है।
assylias

1
@assylias: स्पष्टीकरण के लिए धन्यवाद। मैंने अपना -1 निकाल दिया है।
rwong

16

गणित में, डेल्टा का उपयोग मूल्य से कुछ अंतर का प्रतिनिधित्व करने के लिए किया जाता है, एप्सिलॉन का उपयोग एक मनमाना त्रुटि मान का प्रतिनिधित्व करने के लिए किया जाता है। इस मामले में, एप्सिलॉन पारंपरिक नाम होगा।


8

अपने प्रश्न का सीधे उत्तर देने के लिए, आप इस शब्द का उपयोग करना चाहते हैं epsilon। अधिक सटीक रूप से, यह machine epsilonसामान्य उपयोग "मशीन" से गिरता है और बस उपयोग होता है epsilon

float.hमैं देख रहा हूँ की मेरी स्थानीय प्रति में देख:

#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */  
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
#define LDBL_EPSILON    DBL_EPSILON             /* smallest such that 1.0+LDBL_EPSILON != 1.0 */

और संबंधित टिप्पणियां यह स्पष्ट करती हैं कि एप्सिलॉन वह शब्द है जिसका आप उल्लेख कर रहे हैं।

लेकिन हम यह सत्यापित करने के लिए कुछ अन्य, बाहरी संदर्भों पर भी भरोसा कर सकते हैं कि epsilonयह सही शब्द है। देखें यहाँ , यहाँ , यहाँ , और अंत में के इस संयोजन अतः क्वेरी टैग । मैं IEEE 754 मानक को उद्धृत करने के लिए एक सीधा संदर्भ खोजने में सक्षम नहीं था।


आपने पूछा नहीं, लेकिन मुझे यह संदर्भ मिला जो आपके प्रश्न को स्पष्ट करने के लिए आपके द्वारा दिए गए उदाहरण के लिए बहुत प्रासंगिक है।

कुछ अंतर्दृष्टि के लिए फ्लोटिंग पॉइंट वैल्यू की तुलना करने पर वाल्व के ब्रूस डॉसन के इस ब्लॉग लेख पर एक नज़र डालें कि आप जो तुलना करना चाहते हैं उसका उपयोग क्यों नहीं करना चाहते हैं।

उस लेख में काफी जानकारी भरी हुई है, लेकिन यह वहां से सबसे अधिक प्रासंगिक स्निपेट है:

अगर समानता के लिए फ्लोट्स की तुलना करना एक बुरा विचार है, तो यह जाँचने के बारे में कि क्या उनका अंतर कुछ त्रुटि सीमा या एप्सिलॉन मान के भीतर है, जैसे:

bool isEqual = fabs(f1 – f2) <= epsilon;

इस गणना के साथ हम दो झांकियों की अवधारणा को काफी करीब से व्यक्त कर सकते हैं कि हम उन्हें समान समझना चाहते हैं। लेकिन एप्सिलॉन के लिए हमें किस मूल्य का उपयोग करना चाहिए?
ऊपर दिए गए हमारे प्रयोग को देखते हुए हमें अपनी राशि में त्रुटि का उपयोग करने के लिए लुभाया जा सकता है, जो लगभग 1.19e-7f था। वास्तव में, फ्लोट में भी एक परिभाषित है। उस सटीक मूल्य के साथ, और इसे FLT_EPSILON कहा जाता है।
जाहिर है कि यह है। हेडर फ़ाइल देवताओं ने बात की है और FLT_EPSILON एक सच्चा एप्सिलॉन है!
सिवाय इसके कि बकवास है। 1.0 और 2.0 के बीच की संख्या के लिए FLT_EPSILON आसन्न फ्लोट्स के बीच अंतर का प्रतिनिधित्व करता है। 1.0 से छोटी संख्या के लिए FLT_EPSILON का एक एप्सिलॉन जल्दी से बहुत बड़ा हो जाता है, और छोटी पर्याप्त संख्या के साथ FLT_EPSILON आपके द्वारा तुलना किए जा रहे नंबरों से बड़ा हो सकता है!

डॉसन फ्लोट्स की तुलना करते समय और इस तरह के बहुत छोटे मूल्यों से निपटने के दौरान शामिल जटिलताओं के बारे में कुछ अन्य विचार करते हैं, इसलिए मैं आपके बाकी पोस्ट को पढ़ने के लिए प्रोत्साहित करूंगा।


आप अपने उत्तर के पहले भाग को स्पष्ट करना चाह सकते हैं: ब्रूस के लेख में पहले से ही बताया गया है कि सहिष्णुता तुलना के लिए व्यक्ति को लगातार एप्सिलॉन (जैसे हेडर फाइल में परिभाषित) का उपयोग क्यों नहीं करना चाहिए। इसके अलावा, कई मामलों में, कुछ लाखों ULPs की त्रुटि के बारे में चिंता करने के लिए कुछ नहीं है, क्योंकि अधिकांश अनुप्रयोगों में, हम कम से कम महत्वपूर्ण अंकों में त्रुटियों की तुलना में अधिक महत्वपूर्ण अंकों के बारे में अधिक परवाह करते हैं, क्योंकि पहले से ही डबल-परिशुद्धता पहले से ही देता है हम जितना ध्यान रखते हैं उससे कई अधिक अंक।
23

@rwong - जैसा कि मैंने इसे पढ़ा, सवाल यह था कि एक स्थिर नाम का उपयोग करने के लिए सही शब्द की पहचान करें। इसलिए, मैंने कुछ अन्य लोगों के साथ मशीन एप्सिलॉन को फ्लोट.एच संदर्भ प्रदान किया। डावसन का लेख आईईईई 754 संदर्भ के लिए खोज करते समय मुझे मिला कुछ है और मैंने सोचा कि simplest formulaतुलना के लिए ओपी के लिए प्रासंगिक था । कई लोग पहले प्रयास के रूप में उस दृष्टिकोण का उपयोग करते हैं, और मैंने डॉसन के लेख को शामिल किया क्योंकि यह वास्तव में तुलना की बारीकियों में बदल जाता है। इसलिए मैंने सीधे सवाल का जवाब देने की कोशिश की और फिर इशारा किया कि क्यों न इसे उस तरह से इस्तेमाल किया जाए।

5

यह एक त्रुटि फ़ंक्शन है; निरपेक्ष त्रुटि आमतौर पर कहा जाता है ε (एप्सिलॉन) या Δ x लिए कुछ मात्रा एक्स:

ε = | अपेक्षित - वास्तविक |

Δ एक्स = | x 0 - x  |

सापेक्ष त्रुटि कभी कभी कहा जाता है η (ईटीए):

η = | 1 - वास्तविक / अपेक्षित |

प्रोग्रामिंग उद्देश्यों के लिए, absoluteErrorऔर relativeError(या कुछ संक्षिप्त रूप में) अधिक वर्णनात्मक हैं। यदि आप यह दावा करना चाहते हैं कि त्रुटि एक निश्चित मूल्य से कम है, तो उस मूल्य को बस एक सीमा या सहिष्णुता कहा जाएगा ।

देख:


3

मैं इसे "सहिष्णुता" कहूंगा।

हो सकता है कि यह गणितीय रूप से सही शब्द नहीं है, लेकिन केवल यह तथ्य कि आप सवाल पूछते हैं, मुझे लगता है कि "डेल्टा" या "एप्सिलॉन" का उपयोग करने के लिए एक अच्छा चर नाम नहीं होगा।

मेरे अनुभव में, पहचानकर्ता नामों का उपयोग करना बेहतर है जो उन लोगों के लिए समझ में आता है जो वास्तव में कोड पढ़ेंगे। क्या अच्छा है एक पूरी तरह से सही नाम अगर इसका मतलब है कि पाठक को यह समझने के लिए विकिपीडिया पर देखने की जरूरत है कि इसका क्या मतलब है?


+1। मैं हमेशा आशा करता हूं कि लोग अपने सहकर्मियों से इन नामकरण प्रश्नों के बारे में पूछने के साथ-साथ यहां पोस्टिंग भी करेंगे।
MarkJ

6
-1, उनसे बचने के लिए सम्मेलनों को सीखना बेहतर है।
djechlin

+1 क्योंकि यह ठीक वही कारण है जिसके कारण मैंने यह प्रश्न पोस्ट किया है।
नोबल अपलिफ्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.