NaNs i Infinites mogą zepsuć takie porównania, o czym już wspominali inni.
Jednak jest jeszcze jedna pułapka: w C++ nie można polegać na wyrażeniu typu float w czasie kompilacji, porównywalnym równym temu samemu wyrażeniu ocenianemu w czasie wykonywania.
Powodem tego jest to, że C++ pozwala na rozszerzoną precyzję obliczeń fp, w dowolny sposób, chcąc nie chcąc. Przykład:
#include <iostream>
// This provides sufficent obfuscation so that g++ doesn't just inline results.
bool obfuscatedTrue() { return true; }
int main()
{
using namespace std;
double const a = (obfuscatedTrue()? 3.0 : 0.3);
double const b = (obfuscatedTrue()? 7.0 : 0.7);
double const c = a/b;
cout << (c == a/b? "OK." : "\"Wrong\" comparision result.") << endl;
}
Wyniki z jednego konkretnego kompilatora:
C:\test> g++ --version | find "++"
g++ (TDM-2 mingw32) 4.4.1
C:\test> g++ fp_comparision_problem.cpp & a
"Wrong" comparision result.
C:\test> g++ -O fp_comparision_problem.cpp & a
OK.
C:\test> _
Cheers & HTH,
- Alf
spróbować go debugowania.. – rkellerm
@ rursw1 Bardziej zainteresowany, jeśli istnieje gwarancja ze standardu – CsTamas
@ rursw1: To nie zadziała. –