आज सुबह मेरे पास एक छोटा डब्ल्यूटीएफ क्षण था। चौथाई WTF इस के साथ संक्षेप किया जा सकता है:फ्लोट अतिरिक्त डबल को बढ़ावा दिया?
float x = 0.2f;
float y = 0.1f;
float z = x + y;
assert(z == x + y); //This assert is triggered! (Atleast with visual studio 2008)
कारण है कि अभिव्यक्ति x + y
दोगुना करने के लिए प्रोत्साहित किया और z
में छोटा संस्करण के साथ तुलना की जाती है लगता है। (यदि मैं z
से double
बदलता हूं तो जोर ट्रिगर नहीं किया जाता है)।
मैं देख सकता हूं कि सटीक कारणों से यह परिणाम को एक परिशुद्धता में परिवर्तित करने से पहले डबल परिशुद्धता में सभी फ़्लोटिंग पॉइंट अंकगणित करने के लिए समझ में आता है। मुझे मानक में निम्नलिखित पैराग्राफ मिला (जो मुझे लगता है कि मुझे पहले से ही पता था, लेकिन इस संदर्भ में नहीं):
4.6.1। "प्रकार float
का एक rvalue प्रकार double
के एक rvalue करने के लिए परिवर्तित किया जा सकता है। मूल्य अपरिवर्तित है"
मेरा प्रश्न है, x + y
गारंटी है दोगुना करने के लिए बढ़ावा दिया जा करने के लिए या संकलक के विवेक पर है?
अद्यतन: कई लोगों ने दावा किया है के बाद से है कि एक चल बिन्दु के लिए ==
उपयोग नहीं करना चाहिए, मैं सिर्फ राज्य के लिए कि विशेष मामले के साथ मैं काम कर रहा हूँ में, एक सटीक तुलना उचित है चाहता था।
फ़्लोटिंग पॉइंट तुलना मुश्किल है, इस विषय पर एक दिलचस्प link है जो मुझे लगता है कि उल्लेख नहीं किया गया है।
तुम भी कोशिश कर सकते हैं "सिर्फ मनोरंजन के लिए" द्वारा एफपीयू पर एक सटीक गणना के लिए मजबूर करने कॉलिंग: _controlfp (_PC_24, MCW_PC); – MaR