निम्नलिखित कोड में, foo1, foo2 और foo3 फ़ंक्शन समकक्ष होने का इरादा रखते हैं। हालांकि जब foo3 को लूप से समाप्त नहीं किया जाता है, तो क्या ऐसा कोई कारण है?आईईईई -754 फ्लोटिंग पॉइंट कंप्यूटेशंस, समानता और संकुचित
template <typename T>
T foo1()
{
T x = T(1);
T y = T(0);
for (;;)
{
if (x == y) break;
y = x;
++x;
}
return x;
}
template <typename T>
T foo2()
{
T x = T(0);
for (;;)
{
T y = x + T(1);
if (!(x != y)) break;
++x;
}
return x;
}
template <typename T>
T foo3()
{
T x = T(0);
while (x != (x + T(1))) ++x;
return x;
}
int main()
{
printf("1 float: %20.5f\n", foo1<float>());
printf("2 float: %20.5f\n", foo2<float>());
printf("3 float: %20.5f\n", foo3<float>());
return 0;
}
नोट: यह/fp रिलीज़ मोड में सटीक के साथ VS2010 का उपयोग कर संकलित किया गया। सुनिश्चित नहीं है कि जीसीसी आदि इस कोड का इलाज कैसे करेंगे, कोई भी जानकारी बहुत अच्छी होगी। क्या यह एक मुद्दा हो सकता है जहां foo3 में, x और x + 1 मान किसी भी तरह NaN बन जाते हैं?
दिलचस्प मुद्दा। सभी तीन कार्य जीसीसी 4.2.1 पर अपेक्षित के रूप में समाप्त हो जाते हैं। मैं इसे वीएस में एक बग कहने का लुत्फ उठा रहा हूं। – ComicSansMS
हम्म। मेरे लिए एक अति उत्साही अनुकूलन (यानी, एक कंपाइलर बग) की तरह बदबू आ रही है। –
@ मार्क डिकिंसन: वीएस -2010 –