के रूप में अन्य लोगों ने कहा, यह सिर्फ एक बुनियादी समस्या यह है कि आप जब फ्लोटिंग प्वाइंट कर मिलता है अंकगणित कोई आधार। यह बस होता है कि बेस -2 कंप्यूटर में सबसे आम है (क्योंकि यह कुशल हार्डवेयर कार्यान्वयन को स्वीकार करता है)।
सबसे अच्छा फिक्स, यदि संभव हो, तो अपने लूपिंग के लिए संख्या के किसी प्रकार के भाग्य का प्रतिनिधित्व करने के लिए स्विच करना है, जिससे फ़्लोटिंग-पॉइंट मान उस से प्राप्त किया जा सकता है। ठीक है, वह overblown लगता है! अपने विशिष्ट मामले के लिए, मैं लिखते हैं के रूप में:
int dTimes10 = 20;
double d;
while(dTimes10 != 0) {
dTimes10 -= 2;
d = dTimes10/10.0;
}
यहाँ, हम वास्तव में अंशों [20/10, 18/10, 16/10 के साथ काम कर रहे हैं, ..., 2/10, 0/10] जहां फ़्लोरिंग-पॉइंट में कनवर्ट करने से पहले, एक निश्चित संप्रदाय के साथ संख्या में पूर्णांक (यानी, सही पाने में आसान) के साथ पुनरावृत्ति किया जाता है। यदि आप इस तरह के काम करने के लिए अपने वास्तविक पुनरावृत्तियों को फिर से लिख सकते हैं, तो आपको बहुत सफलता मिलेगी (और वे वास्तव में आप जो भी कर रहे थे उससे कहीं अधिक महंगा नहीं हैं, जो शुद्धता पाने के लिए एक महान व्यापार-बंद है)।
यदि आप ऐसा नहीं कर सकते हैं, तो आपको अपनी तुलना के रूप में बराबर-भीतर-ईपीएसलॉन का उपयोग करने की आवश्यकता है। लगभग abs(d - target) < ε
के साथ, जहां ε (ईपीएसलॉन) चयन कभी-कभी अजीब हो सकता है। असल में, ε का सही मान कारकों के समूह पर निर्भर करता है, लेकिन शायद यह 0 के रूप में सबसे अच्छा चुना गया है।001 उदाहरण के पुनरावृत्ति के लिए चरण मान के पैमाने को दिया गया है (यानी, यह चरण की परिमाण का आधा प्रतिशत है, इसलिए इसके भीतर कुछ भी जानकारीपूर्ण के बजाय त्रुटि होगी)।
स्रोत
2010-07-28 09:51:50
कभी भी फ़्लोटिंग मानों के साथ '==' का उपयोग न करें। शायद 'f> epsilon' जैसे कुछ का उपयोग करें। – pascal
[यह कुछ दिन हो गया था, मुझे लगता है कि हम देय थे।] (Http://docs.sun.com/source/806-3568/ncg_goldberg.html) – GManNickG
जावा में, मुझे लगता है कि "Strictfp" संशोधक है ऐसी परिस्थितियों के लिए –