なぜtan 45
(ラジアンで0.7853981633974483)が私に与えるのです0.9999
か?次のコードの何が問題になっていますか?
System.out.println(Math.tan(Math.toRadians(45.0)) );
ここにタイプミスはないと思います。
では、ここでの解決策は何ですか?
なぜtan 45
(ラジアンで0.7853981633974483)が私に与えるのです0.9999
か?次のコードの何が問題になっていますか?
System.out.println(Math.tan(Math.toRadians(45.0)) );
ここにタイプミスはないと思います。
では、ここでの解決策は何ですか?
浮動小数点の計算は、多くの場合、そのような不正確さにつながります。問題は、固定されたビット数内で数値を正確に表すことができないことです。
別の例(10進数)を示すために、私たちは皆、それに同意し3 * (1/3) = 1
ます。ただし、電卓の小数点以下4桁しかない場合は、1/3
として表され0.3333
ます。それを掛けると3
、得られ0.9999
ません1
。
詳細として、ほとんどのシステムのフローティングポイントは、通常、IEEE754標準を使用して表されます。あなたはそれを検索するか、詳細についてはウィキペディアのページを参照することができます。IEEE浮動小数点
に最も近いのdouble
はpi/4
正確に 0x1.921fb54442d18p-1
です。このdoubleの接線は、必要以上のビットになりますが、です0x1.fffffffffffff72cece67p-1
。が。未満であるため、最も近い値に丸めると正確にdouble
得られます。 0x1.fffffffffffffp-1
0x1.fffffffffffff72cece67p-1
0x1.fffffffffffff8p-1
これを使って
double radians = Math.toRadians(45.0);
System.out.format("The tangent of 45.0 degrees is %.4f%n", Math.tan(radians));
これはおそらくtan(45)
が1であり、残りが丸め誤差であるためです。浮動小数点の計算がどのように機能するかにより、浮動小数点の計算で正確な結果が得られる可能性はほとんどありません。