f
float
परिशुद्धता का उपयोग कर रहा है, लेकिन 0।98 double
डिफ़ॉल्ट रूप से परिशुद्धता में है, इसलिए f <= 0.98
कथन double
परिशुद्धता का उपयोग करके तुलना की जाती है।
f
इसलिए तुलना में double
में परिवर्तित किया गया है, लेकिन परिणाम 0.98 से थोड़ा बड़ा हो सकता है।
उपयोग
if(f <= 0.98f)
या f
बजाय के लिए एक double
का उपयोग करें।
विस्तार में ... float
संभालने IEEE single-precision और double
IEEE double-precision है।
इस प्रकार के फ्लोटिंग पॉइंट नंबर बेस -2 प्रतिनिधित्व के साथ संग्रहीत किए जाते हैं। में आधार-2 के लिए इस नंबर एक अनंत परिशुद्धता की जरूरत है, क्योंकि यह एक दोहराया दशमलव है प्रतिनिधित्व करने के लिए:
0.98 = 0.1111101011100001010001111010111000010100011110101110000101000...
एक float
केवल महत्वपूर्ण आंकड़े के 24 बिट स्टोर कर सकते हैं
0.111110101110000101000111_101...
^round off here
= 0.111110101110000101001000
= 16441672/2^24
= 0.98000001907...
एक double
53 स्टोर कर सकते हैं, यानी signficant आंकड़े के टुकड़े, इसलिए
0.11111010111000010100011110101110000101000111101011100_00101000...
^round off here
= 0.11111010111000010100011110101110000101000111101011100
= 8827055269646172/2^53
= 0.97999999999999998224...
तो 0.98 से थोड़ा 0,123,411 में float
में बड़े और छोटे बन जाएगा।
सामान्य नियम: क्या आप कभी भी 'सटीक' फैशन में फ़्लोटिंग-पॉइंट नंबरों की तुलना नहीं करते हैं। यह सिर्फ समझ में नहीं आता है। हमेशा कुछ 'ईपीएसलॉन' – valdo
@ वाल्डो का उपयोग करें: यह अधिक व्यापक विश्लेषण के बिना आम तौर पर बुरी सलाह है। –
'शून्य मुख्य()' गलत है। 'int मुख्य (शून्य)' सही है। –