अलावा संभवतः अलग आकार के रजिस्टरों से, आप फ्लोटिंग बिंदु denormalized है (सीक्यू फ्लश करने वाली शून्य) के बारे में चिंता करने की (Why does changing 0.1f to 0 slow down performance by 10x? देखें)
बस weirdness इस का कारण बन सकता की एक विचार देने के लिए, कोशिश कोड के इस बिट:
float a = 0.000000000000000000000000000000000000000047683384;
const float b = 0.000000000000000000000000000000000000000047683384;
float aa = a, bb = b;
#define SUPPORT_DENORMALIZATION ({volatile double t=DBL_MIN/2.0;t!=0.0;})
printf("support denormals: %d\n",SUPPORT_DENORMALIZATION);
printf("a = %.48f, aa = %.48f\na==aa %d, a==0.0f %d, aa==0.0f %d\n",a,aa,a==aa,a==0.0f,aa==0.0f);
printf("b = %.48f, bb = %.48f\nb==bb %d, b==0.0f %d, bb==0.0f %d\n",b,bb,b==bb,b==0.0f,bb==0.0f);
जो या तो देता है: (बिना फ्लश-टू-जीरो संकलित)
support denormals: 1
a = 0.000000000000000000000000000000000000000047683384, aa = 0.000000000000000000000000000000000000000047683384
a==aa 1, a==0.0f 0, aa==0.0f 0
b = 0.000000000000000000000000000000000000000047683384, bb = 0.000000000000000000000000000000000000000047683384
b==bb 1, b==0.0f 0, bb==0.0f 0
या: (gcc -ffast-math
साथ संकलित)
support denormals: 0
a = 0.000000000000000000000000000000000000000000000000, aa = 0.000000000000000000000000000000000000000000000000
a==aa 1, a==0.0f 1, aa==0.0f 1
b = 0.000000000000000000000000000000000000000047683384, bb = 0.000000000000000000000000000000000000000000000000
b==bb 1, b==0.0f 0, bb==0.0f 1
कहाँ कि अंतिम पंक्ति निश्चित रूप से अजीब एक है बाहर: b==bb && b!=0.0f && bb==0.0f
सच होगा।
तो यदि आप अभी भी फ़्लोटिंग पॉइंट मानों की तुलना करने के बारे में सोच रहे हैं, कम से कम छोटे मूल्यों से दूर रहें।
अद्यतन युगल के बजाय तैरता के उपयोग के कारण इस किया जा रहा है के बारे में कुछ टिप्पणियां की भरपाई के लिए, यह भी डबल के लिए काम करता है, लेकिन आप, DBL_MIN
कहीं नीचे करने के लिए लगातार सेट करने के लिए जैसे की आवश्यकता होगी 1e-309
।
अपडेट 2 नीचे दी गई कुछ टिप्पणियों से संबंधित कोड नमूना। इससे पता चलता है कि इस समस्या को युगल के लिए मौजूद है और साथ ही, इसलिए तुलना करना असंगत हो सकता है कि (जब शून्य करने के लिए फ्लश सक्षम किया गया है)
double a;
const double b = 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001225;
const double c = 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002225;
printf("b==c %d\n",b==c);
a = b;
printf("assigned a=b: a==b %d\n",a==b);
a = c;
printf("assigned a=c: a==b %d\n",a==b);
उत्पादन:
b==c 0
assigned a=b: a==b 1
assigned a=c: a==b 1
मुद्दा अंतिम पंक्ति है, जहां में से पता चलता आप c!=b
के साथ a=c
असाइन करने के बाद a==b
को स्पष्ट रूप से उम्मीद करेंगे।
रनटाइम के दौरान '_val' का मान बदला जाएगा? –
हां, इसे वास्तविक मूल्य में बदला जा सकता है (फिर भी निश्चित रूप से '> -1')। मुझे यकीन नहीं है कि इसे वापस 'रीसेट' करने की आवश्यकता होगी या नहीं। –
मुझे उम्मीद है कि एक फ्लोटिंग पॉइंट वैल्यू की प्रतिलिपि इसे बिल्कुल बदल नहीं पाएगी, और उसी प्रकार के दो चर 'ए' और' बी 'दिए गए हैं,' ए = बी 'परिणाम' ए == बी ' सच होना हालांकि, मैं इस धारणा को सामान्य ज्ञान पर आधारित कर रहा हूं, जो मुझे अतीत में जाने के लिए जाना जाता है। – Rook