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 回答