2013-06-18 6 views
5
#include<stdio.h> 
int main() 
{ 
    float a,b; 
    a=4.375; 
    b=4.385; 

    if(a==4.375) 
     printf("YES\n"); 
    else 
     printf("NO\n"); 

    if(b==4.385) 
     printf("YES\n"); 
    else 
     printf("NO\n"); 

    return 0; 
} 

उत्तर:तुलना इस कोड के

YES 
NO 

मुझे हमेशा यही लगता अगर मैं डबल मूल्य के साथ एक नाव की तुलना करें। यह कभी मेल नहीं खाएगा। जब तक कि मूल्य शुद्ध पूर्णांक न हो। लेकिन यहाँ तैरने लगते हैं "एक" 4.375 उस में सटीक है, लेकिन "बी"

printf("%0.20f\n",a); 
printf("%0.20f\n",b); 

This prints : 

4.37500000000000000000 
4.38500022888183593750 



but if i print 

printf("%0.20f\n",4.475); 

It prints 4.47499990463256835938 

कैसे की जाती है यह गोलाई प्रभाव से कुछ में और दूसरों में नहीं दिख रहा है नहीं है।

क्या कोई इसे समझा सकता है। फ्लोट वैरिएबल में मूल्य उसमें निहित होने पर और जब ऐसा नहीं होता है तो "WE" का न्याय कैसे करना चाहिए?

+1

0.375 = 3/8, 8 = 2^3 के बाद से, यह बाइनरी चर – gkovacs90

+0

में फ्लोट शाब्दिक के साथ फ्लोट की तुलना में अजीब आउटपुट के संभावित डुप्लिकेट में संग्रहीत करने में समस्या नहीं है (http://stackoverflow.com/प्रश्न/1839422/अजीब-आउटपुट-इन-तुलना-फ्लोट-साथ-फ्लोट-शाब्दिक) – devnull

+0

डुप्लिकेट नहीं ..मैंने दोनों स्थितियों के बीच अंतर पूछा सर 0 :) –

उत्तर

1

एक द्विआधारी अंश के लिए दशमलव भिन्न से रूपांतरण आपके मामले में, सटीक केवल तभी दशमलव भिन्न 0.5, 0.25 तरह द्विआधारी अंशों द्वारा अभिव्यक्त किया जा सकता है ..., आदि

उदाहरण के लिए

0,375 = 0,25 + 0,125 = 2 -2 + 2 -3

तो यह द्वि का उपयोग करके ठीक वैसे ही प्रदर्शित किया जा सकता है नारी भिन्नताएं

जहां 0.385 संख्या को द्विआधारी अंशों का उपयोग करके सटीक रूप से प्रदर्शित नहीं किया जा सकता है। तो 0.5, 0.25, 0.125, ... आदि जैसे नंबर या इन संख्याओं का संयोजन फ़्लोटिंग पॉइंट नंबर के रूप में बिल्कुल प्रदर्शित किया जा सकता है। 0.385 जैसे अन्य लोग गलत परिणाम देंगे जब तुलना या समानता संचालन उनके पर किया जाता है।

+0

धन्यवाद अब मुझे मिल गया !! –

+0

यदि परिशुद्धता अंक 25 में से अधिक हैं तो। कोई और मैच नहीं! –

+1

यह उत्तर यह नहीं बताता है कि 'ए' में संग्रहीत '4.385' एक शाब्दिक' 4.385' के बराबर तुलना नहीं करता है। दोनों हैं, जैसा कि यह उत्तर वर्णन करता है, दो की शक्तियों के साथ अनुमानित। एक अच्छे उत्तर में अंतर का वास्तविक कारण होना चाहिए: 'फ्लोट' ऑब्जेक्ट में 'डबल' शाब्दिक से कम परिशुद्धता है, इसलिए वे अनुमानित रूप से 4.385 अनुमानित नहीं कर सकते हैं, और उनके मूल्य अलग हैं। –

1

फ़्लोटिंग पॉइंट जादू नहीं हैं। उनमें एक सटीक मान होता है और यदि आप इसकी तुलना करते हैं तो वे बराबर की तुलना करेंगे। दो समस्याएं 1) कुछ परिचालन सटीक मुद्दों के कारण हमेशा पूरी तरह सटीक नहीं होते हैं। यदि आप एक फ्लोट में एक जोड़ते हैं और फिर एक घटाते हैं तो उसमें से कोई भी कम से कम महत्वपूर्ण मूल्य बिट्स में परिशुद्धता के कुछ नुकसान का कारण बन सकता है और जब आप इसे घटाते हैं तो आप वही वैल्यू पर वापस नहीं आते हैं जो आप उम्मीद करते हैं। 2) फ्लोटिंग पॉइंट बाइनरी प्रारूप में प्रत्येक दशमलव मान का सटीक रूप से प्रतिनिधित्व करना संभव नहीं है। उदाहरण के लिए 0.1 के सटीक मान को फ़्लोटिंग पॉइंट बाइनरी नंबर में उसी तरह से स्टोर करना संभव नहीं है, जिस तरह से आप दशमलव मान के रूप में 1/3.0 के मान को नहीं लिख सकते हैं, इससे कोई फ़र्क नहीं पड़ता कि आप कितने अंक का उपयोग करते हैं।

लेकिन आपके मामले में यदि आप कोई मान संग्रहीत करते हैं और उसी मूल्य के साथ इसकी तुलना करते हैं तो उन्हें समान रूप से तुलना करना चाहिए क्योंकि उनके दोनों में एक ही समस्या होगी। आपकी समस्या हालांकि यह है कि आप इस तरह की तुलना नहीं कर रहे हैं। 4.375 और 4.385 फ्लोट नहीं होते हैं, वे युगल होते हैं और उन्हें परिवर्तित करने के लिए परिवर्तित कर दिया जाता है, इसलिए जब आप उनकी तुलना करते हैं तो यह संभव है कि परिवर्तित मूल्य काफी समान न हो। यदि आप फ्लोट वैल्यू का उपयोग करने के लिए 4.385 एफ और 4.385 एफ लिखते हैं तो आपको दोनों बार हाँ मिलना चाहिए।

संबंधित मुद्दे