在以下代码中,函数 foo1、foo2 和 foo3 旨在等效。但是,当 run foo3 没有从循环中终止时,是否有这种情况的原因?
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 的问题吗?