我有一个非常简单的Java测试用例,它先调用Math.exp(double),然后调用StrictMath.exp(double),出于某种原因,我不能理解Java 8上的结果是不同的,尽管从JDK源代码看,Math.exp似乎只是简单地委托给StrictMath.exp。
public static void main(String[] args) {
Properties p = System.getProperties();
System.out.println(p.get("java.runtime.version"));
System.out.println(p.get("java.specification.version"));
System.out.println(Math.exp(1d));
System.out.println(StrictMath.exp(1d));
}Java 8上的结果
1.8.0_66-b18
1.8
null
2.718281828459045
2.7182818284590455在Java 7上
1.7.0_21-b11
1.7
2.7182818284590455
2.7182818284590455感谢任何指点,更多的是出于好奇心,而不是任何实际问题。
发布于 2015-11-24 03:58:41
这个问题基本上与乔链接到的问题相反:java.lang.Math.log replaced by intrinsic call, why not java.lang.Math.exp()?
在此之前,revision 6759698e3140 Math.exp()在运行时没有被intrinsic call替换,这意味着它被委托给StrictMath.exp()。在那次修订之后(因此也就是Java8的所有版本),Math.exp()可能会给出不同的结果,因为Java虚拟机将优化调用。
从概念上讲,您可以认为Math提供了“快速”功能,而StrictMath提供了“正确”功能。当Math不能做得更好时,它会求助于StrictMath,但是关于Math行为的保证比StrictMath的更弱,因此可以比StrictMath更优化(可能会以一些有限的正确性为代价)。
https://stackoverflow.com/questions/33870711
复制相似问题