メソッドに少し問題がありMath.cos()
ます。を使用する前に、角度をラジアンに変換する必要がありMath.cos()
ます。しかし、私がそうするだけなら:
System.out.println(Math.cos(Math.toRadians(90));
出力:6.123233995736766E-17
Math.sin()
うまく機能しています。
メソッドに少し問題がありMath.cos()
ます。を使用する前に、角度をラジアンに変換する必要がありMath.cos()
ます。しかし、私がそうするだけなら:
System.out.println(Math.cos(Math.toRadians(90));
出力:6.123233995736766E-17
Math.sin()
うまく機能しています。
三角法から:
sin x ~= x, for small values of x
sin x = cos x+pi/2
pi / 2はIEEE-754浮動小数点で正確に表すことができないため、ある値xだけオフにする必要があります。つまり、pi / 2 +-xで表されます。ここで、x<の最下位ビットです。浮動小数点システム。この場合、これは2 ^ -53=1.1102e-16です。
この特定のケースでは、x〜= 6.123233995736766E-17であり、これは最大誤差の約55%です。だから、それはかなり良い結果です...
Javadocを参照してください。「度からラジアンへの変換は一般的に不正確です。」
値は正しい結果に非常に近いです。度をラジアンに変換する浮動小数点演算の精度が低下しているように見えます。
一時的に石鹸箱の上に立っていると、人々は精度と精度の概念について混乱していると思います。一部の人が言っているように、これは問題ですか?それって問題ですか?バグ?それとも、浮動小数点演算の予想される動作ですか?
90度は、doubleであっても、整数として完全に表現できる数値です。ただし、円周率/ 2ラジアンは実数であり、正確に表現されていないため、表現はわずかに不正確になります。損失は正確さです。実際、これは予想される動作です。結果の最下位ビットを決して信頼してはなりません。
次に、三角関数の値を計算すると、さらに精度が低下する可能性があります。象徴的な意味で真実であるとわかっている結果を正確に得ることはできません。したがって、sin(pi / 3)は正確にsqrt(3)/ 2ではない可能性がありますが、とにかくsqrt(3)/2を正確に表すことはできません。これはすべて予想されることであり、これらの数値のLSBを信頼するのではなく、適切なコードで処理する必要がある動作です。