在下面的代码中,函数foo1、foo2和foo3旨在等效。但是在运行时,foo3在循环中不会终止,这是为什么呢?
注意:这是使用VS2010在发布模式下编译的,使用/fp precise选项。不确定GCC等如何处理此代码,希望能提供任何信息。可能是foo3中x和x+1值变成NaN的问题吗?
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 precise选项。不确定GCC等如何处理此代码,希望能提供任何信息。可能是foo3中x和x+1值变成NaN的问题吗?
x + T(1)
。所以我的猜测是,和与比较都是使用double
类型执行的,因此比较始终为真,但在x
达到2 ** 24
后就不再移动了。如果没有其他人到达,稍后将编写一个经过适当研究的答案。 - Mark Dickinson