2017-12-18 13 views
4

私はJavaScriptの三角関数からいくつかの非常に奇妙な値を得るのはなぜか分かりません。たとえば、JavaScriptの三角関数は機能しませんか?

Math.sin(Math.PI); // returns 1.2246467991473532e-16, but should return 0 
Math.cos(Math.PI/2); // returns 6.123233995736766e-17, but should return 0 
Math.sin(3.14); // returns 0.0015926529164868282, whitch is ok but 
Math.sin(3.141592); // returns 6.535897930762419e-7! 

これをMozillaとChromeで試したところ、同じ結果が得られました。三角関数のパラメータが高すぎるようです。

助けてください!

+1

1.22e-16はゼロに非常に近いです:正確であるには0.000000000000000122です。 Math.PIはPIの完全な表現ではないので、PIは無限であり、変数に含めることができないため、常に近似を得ることになります。 – DarkerIvy

+0

ああ、私はe-16が見えなかったので、答えが間違っていると思った。ありがとう@ダカーエルビー –

+0

問題はありません。結論は、浮動小数点数は非常に正確であるため、完全性の欠如を示すことさえ可能です。 – DarkerIvy

答えて

1

あなたはNumber.EPSILONプロパティが1と最小の浮動小数点数1より大きい

との間の差を表すNumber.EPSILON

使用して値の絶対差分を取り、値を望んでいたと可能性それがNumber.EPSILONより小さいかどうか確認してください。 trueの場合、値の誤差は浮動小数点演算の可能な誤差よりも小さくなります。

console.log([ 
 
    [Math.sin(Math.PI), 0], 
 
    [Math.cos(Math.PI/2), 0], 
 
    [Math.sin(3.14), 0.0015926529164868282], 
 
    [Math.sin(3.141592), 6.535897930762419e-7] 
 
].map(([a, b]) => Math.abs(a - b) < Number.EPSILON));

浮動小数点値の限られたデジタル表現に伴う問題について読むためにいくつかの詳細:

関連する問題