C++ 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
か?
アップデート
Daniel Daranas が指摘したように、関数はおそらく呼び出されたほうがよいでしょうisNearlyEqual
(これは私が気にかけているケースです)。
誰かが「浮動小数点数の比較」を指摘しました。これをもっと目立つように共有したいと思います。