Prawidłowe przetestowanie dwóch liczb zmiennoprzecinkowych dla równości jest czymś, czego wielu ludzi, w tym mnie, nie w pełni rozumie. Dzisiaj jednak pomyślałem o tym, jak niektóre standardowe pojemniki definiują równość pod względem operator<
. Zawsze widzę ludzi mających problemy z równością, ale nigdy z innymi porównaniami relacyjnymi. Jest ich nawet silent versions, które obejmują wszystko oprócz równości i nierówności.Jeśli operator <działa poprawnie dla typów zmiennoprzecinkowych, dlaczego nie możemy go użyć do testowania równości?
Zakładając operator<
działa „prawidłowo”, w przeciwieństwie do operator==
, dlaczego my nie mogliśmy to zrobić:
bool floateq(float a, float b) {
//check NaN
return !(a < b) && !(b < a);
}
W rzeczywistości, ja uruchomić test z dodatkowym przeciążenia dla deblu, jak widać here, i to wydaje się, że te same pułapki porównać je z operator==
:
std::cout << "float->double vs double: "
<< floateq(static_cast<double>(0.7f), 0.7) << " "
<< (static_cast<double>(0.7f) == 0.7) << "\n";
wyjściowy:
float-> double vs podwójne: 0 0
jestem martwić się o używaniu wszystkie operatorów porównania, czy istnieje jakiś inny aspekt porównywania liczb zmiennoprzecinkowych, że nie jestem zrozumieniem prawidłowo?
Nie ma nic złego w porównaniu wartości zmiennoprzecinkowych jako takich. Problem polega na tym, że wynik może nie działać zgodnie z oczekiwaniami. –