W poniższym kodzie funkcje foo1, foo2 i foo3 mają być równoważne. Jednak, gdy uruchamiamy foo3 nie kończy się z pętli, czy istnieje powód, dlaczego tak jest?Obliczenia zmiennoprzecinkowe IEEE-754, równość i zwężenie
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;
}
Uwaga: ta została opracowana przy użyciu VS2010 z/fp precyzyjne w trybie zwolnienia. Nie wiem, jak GCC itp. Traktowałby ten kod, każda informacja byłaby świetna. Czy to może być problem, w przypadku gdy w foo3 wartości x i x + stają się w jakiś sposób NaN?
Interesujący problem. Wszystkie trzy funkcje kończą się zgodnie z oczekiwaniami na gcc 4.2.1. Kusiło mnie, by nazwać to błędem w VS. – ComicSansMS
Hmm. Pachnie do mnie jak optymalizacja nadmiaru (np. Błąd kompilatora). –
@MarkDickinson: Zawiesza się na mnie pod kompilacją debugowania w VS2010 –