En el siguiente código, las funciones foo1, foo2 y foo3 son equivalentes. Sin embargo, cuando ejecutar foo3 no termina desde el ciclo, ¿hay alguna razón por la cual este sea el caso?Cálculos en coma flotante IEEE-754, igualdad y estrechamiento
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;
}
Nota: Este fue compilado usando VS2010 con/fp precisa en modo de lanzamiento. No estoy seguro de cómo GCC, etc. trataría este código, cualquier información sería genial. ¿Podría ser esto un problema donde en foo3, los valores x y x + 1 se convierten en NaN de alguna manera?
Problema de interés. Las tres funciones terminan como se esperaba en gcc 4.2.1. Estoy tentado de llamarlo un error en VS. – ComicSansMS
Hmm. Huele como una optimización exagerada (es decir, un error de compilación) para mí. –
@MarkDickinson: se bloquea para mí en una compilación de depuración en VS2010 –