今日、私は(他の誰かが書いた)C ++コードを調べていて、このセクションを見つけました:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
私はこれが理にかなっているかどうかを理解しようとしています。
のドキュメントはepsilon()
言う:
この関数は、1と[double]で表現できる1より大きい最小値の差を返します。
これは0にも適用されepsilon()
ますか?つまり、最小値は0より大きいですか?またはそこに数字の間である0
と0 + epsilon
で表すことができますかdouble
?
そうでない場合、比較は同等someValue == 0.0
ですか?
numeric_limits<>::epsilon
は誤解を招くものであり、無関係です。実際の値と0の差がεを超えない場合は、0と仮定します。εは、マシン依存の値ではなく、問題の仕様に基づいて選択する必要があります。現在のイプシロンは役に立たないのではないかと思います。ほんの少しのFP演算でもそれ以上のエラーを蓄積する可能性があるからです。