NaN и Infinites могут испортить такие сравнения, как уже упоминали другие.
Однако есть еще один подводный камень: в C ++ нельзя полагаться на выражение времени компиляции типа float, сравнивая его с тем же выражением, вычисленным во время выполнения.
Причина этого в том, что C ++ допускает повышенную точность вычислений fp любым способом. Пример:
#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;
}
Результаты с одним конкретным компилятором:
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> _
Приветствия & hth.,
- Альф