Nel seguente codice, le funzioni foo1, foo2 e foo3 sono intese come equivalenti. Tuttavia, quando eseguire foo3 non termina dal ciclo, c'è un motivo per cui questo è il caso?Calcoli a virgola mobile IEEE-754, uguaglianza e restringimento
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: questo è stato compilato utilizzando VS2010 con/fp preciso in modalità di rilascio. Non sono sicuro di come GCC ecc. Possa trattare questo codice, qualsiasi informazione sarebbe ottima. Questo potrebbe essere un problema in cui in foo3, i valori x e x + 1 diventano in qualche modo NaN?
Interessante. Tutte e tre le funzioni terminano come previsto su gcc 4.2.1. Sono tentato di chiamarlo un bug in VS. – ComicSansMS
Hmm. Puzza di ottimizzazione eccessiva (ad es. Un bug del compilatore) per me. –
@MarkDickinson: blocco per me in una build di debug in VS2010 –