0

次のステートメントは成り立つべきではありませんか?

assertTrue(Double.isNaN(Math.tan(Math.acos(0d))));

ただし、Double.NaNJava の戻り値の代わりに

6.123233995736766 * 10^-17    

私の64ビットボックスで。

編集: これはコピー アンド ペースト エラーでした。実際、Javaは戻ります1.633123935319537E16

これは浮動小数点表現によるものであることは承知していますが、正接関数の未定義の値はegと同じ扱いを受けるという印象を受けましたがMath.sqrt(-1d)、この場合、java.lang.Mathは引数は評価前に正です。

4

1 に答える 1

3

何か違うものがあります。

System.out.println(Math.tan(Math.acos(0d)));
// and the tan for the next representable value.
System.out.println(Math.tan(Math.acos(0d) + Math.ulp(Math.acos(0d))));

プリント

1.633123935319537E16
-6.218431163823738E15

64ビット浮動小数点はPI/2を正確に表すことはできません(桁数は無限です)。これはこの値に近い数値を表し、この値のtan()は有限です。

于 2012-12-29T16:41:25.333 に答える