在以下代碼中,函數foo1,foo2和foo3旨在等效。然而,當運行foo3不會從循環中終止時,是否有這種情況的原因?IEEE-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;
}
注意:這是在發佈模式下使用VS2010以/ fp精確編譯的。不知道GCC等會如何處理這些代碼,任何信息都會很棒。難道這是一個問題,在foo3中,x和x + 1的值會以某種方式變成NaN?
有趣的問題。所有三個函數按照預期在gcc 4.2.1上終止。我很想把它稱爲VS中的一個錯誤。 – ComicSansMS
嗯。聞起來像一個過度的優化(即,一個編譯器錯誤)給我。 –
@MarkDickinson:在VS2010中的調試版本中掛起 –