Правильное тестирование двух чисел с плавающей запятой для равенства - это то, что многие люди, включая меня, не вполне понимают. Однако сегодня я подумал о том, как некоторые стандартные контейнеры определяют равенство в терминах operator<
. Я всегда вижу людей с проблемами, связанными с равенством, но никогда с другими реляционными сравнениями. Существуют даже тихие версии их использования, которые включают все, кроме равенства и неравенства.
Предполагая, что operator<
работает "правильно", в отличие от operator==
, почему мы не могли этого сделать:
bool floateq(float a, float b) {
//check NaN
return !(a < b) && !(b < a);
}
Фактически, я выполнил тест с дополнительной перегрузкой для парных, как показано здесь, и, похоже, это те же проблемы, что и сравнивая их с operator==
:
std::cout << "float->double vs double: "
<< floateq(static_cast<double>(0.7f), 0.7) << " "
<< (static_cast<double>(0.7f) == 0.7) << "\n";
Вывод:
float- > double vs double: 0 0
Мне нужно беспокоиться об использовании всех операторов сравнения или есть ли другой аспект сравнения чисел с плавающей запятой, которые я неправильно понимаю?