私の質問の簡単なバージョンは次のとおりです。
x
浮動小数点数が等しいと見なされる場合を決定するための「ベストプラクティス」とMath.round(x)
見なされ、浮動小数点演算による精度の低下を許容するものは何ですか?
長いバージョンは次のとおりです。
特定の浮動小数点値x
を「整数とみなす」べきか、もっと衒学的に言えば「整数の浮動小数点表現とみなす」べきかを決める必要があることがよくあります。
(たとえば、nが整数の場合、数式は
log 10 (10 n )
同じ整数nを表す複雑な方法です。これが、類似の浮動小数点計算の結果が「整数の表現」と見なされる可能性があると言う動機となる考え方です。)
Math.round(x) == x
が に評価されるときはいつでも決定は簡単です: この場合、それは確かに整数 (の浮動小数点表現) であるtrue
と言えます。x
しかし、テストMath.round(x) == x
が に評価される場合、テストは決定的ではありませんfalse
。例えば、
function log10(x) { return Math.log(x)/Math.LN10; }
// -> function()
x = log10(Math.pow(10, -4))
// -> -3.999999999999999
Math.round(x) == x
// -> false
編集: 私がよく目にする「解決策」の 1 つは、 のような任意の許容誤差を選択しε = 1e-6
、 をテストすることですMath.abs(Math.round(x) - x) < ε
。そのような解決策は、私が許容できるよりも多くの偽陽性を生み出すと思います.