9

なぜtan 45(ラジアンで0.7853981633974483)が私に与えるのです0.9999か?次のコードの何が問題になっていますか?

System.out.println(Math.tan(Math.toRadians(45.0)) );

ここにタイプミスはないと思います。

では、ここでの解決策は何ですか?

4

4 に答える 4

19

浮動小数点の計算は、多くの場合、そのような不正確さにつながります。問題は、固定されたビット数内で数値を正確に表すことができないことです。

別の例(10進数)を示すために、私たちは皆、それに同意し3 * (1/3) = 1ます。ただし、電卓の小数点以下4桁しかない場合は、1/3として表され0.3333ます。それを掛けると3、得られ0.9999ません1

詳細として、ほとんどのシステムのフローティングポイントは、通常、IEEE754標準を使用して表されます。あなたはそれを検索するか、詳細についてはウィキペディアのページを参照することができます。IEEE浮動小数点

于 2012-12-08T07:41:13.860 に答える
10

に最も近いのdoublepi/4正確 0x1.921fb54442d18p-1です。このdoubleの接線は、必要以上のビットになりますが、です0x1.fffffffffffff72cece67p-1。が。未満であるため、最も近い値に丸めると正確にdouble得られます。 0x1.fffffffffffffp-10x1.fffffffffffff72cece67p-10x1.fffffffffffff8p-1

于 2012-12-08T15:42:49.897 に答える
2

これを使って

double radians = Math.toRadians(45.0);

System.out.format("The tangent of 45.0 degrees is %.4f%n", Math.tan(radians));
于 2012-12-08T07:41:00.100 に答える
0

これはおそらくtan(45)が1であり、残りが丸め誤差であるためです。浮動小数点の計算がどのように機能するかにより、浮動小数点の計算で正確な結果が得られる可能性はほとんどありません。

于 2012-12-08T07:41:12.003 に答える