С++ FAQ lite [29.17] Почему мое сравнение с плавающей запятой не работает? рекомендует этот тест равенства:
#include <cmath> /* for std::abs(double) */
inline bool isEqual(double x, double y)
{
const double epsilon = /* some small number such as 1e-5 */;
return std::abs(x - y) <= epsilon * std::abs(x);
// see Knuth section 4.2.2 pages 217-218
}
- Правильно ли это, что это означает, что единственными числами, равными нулю, являются
+0
и-0
? - Следует ли использовать эту функцию также при тестировании нуля или, скорее, теста типа
|x| < epsilon
?
Обновление
Как отметил Даниэль Даранас, функцию следует, вероятно, лучше называть isNearlyEqual
(в этом я забочусь).
Кто-то указал эту ссылку, которую я хочу разделить более заметно.