Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Math.pow在重复调用时产生不同的结果_Java_Math_Jvm Hotspot_Pow - Fatal编程技术网

Java Math.pow在重复调用时产生不同的结果

Java Math.pow在重复调用时产生不同的结果,java,math,jvm-hotspot,pow,Java,Math,Jvm Hotspot,Pow,升级到Java 1.8.020后,我们的测试系统报告了错误,但代码没有更改。我发现,使用完全相同的输入参数调用Math.pow()会在重新创建调用时产生不同的结果。在Java 1.8.0_11中,它的行为与预期的一样,并且总是返回相同的值,但在Java 1.8.0_20及更高版本中,它有时返回稍有不同的值 这与问题类似,但不同,因为pow()的结果在一个VM中不同 在Java 1.8.0_20及更高版本下运行时,以下JUnit测试失败 导入静态org.junit.Assert.assertEqu

升级到Java 1.8.020后,我们的测试系统报告了错误,但代码没有更改。我发现,使用完全相同的输入参数调用
Math.pow()
会在重新创建调用时产生不同的结果。在Java 1.8.0_11中,它的行为与预期的一样,并且总是返回相同的值,但在Java 1.8.0_20及更高版本中,它有时返回稍有不同的值

这与问题类似,但不同,因为pow()的结果在一个VM中不同

在Java 1.8.0_20及更高版本下运行时,以下JUnit测试失败

导入静态org.junit.Assert.assertEquals;
导入java.util.function.BiFunction;
导入org.junit.BeforeClass;
导入org.junit.Test;
公共类功率测试{
专用静态最终整数N=1000000;
专用静态最终双基=5350.45632977186;
专用静态最终双出口=2.0;
专用静态双评估(最终双功能f){
返回f.apply(基数,exp);
}
专用void循环(最终双功能f){
最终双x=评估值(f);
对于(int i=0;i
在Java 1.8.0_11下,或者使用
-Xint
关闭热点时,测试不会失败。pow()的严格数学版本产生一致的结果。我怀疑hotspot JIT会进行一些优化,从而切换到pow()的不同实现,这会对某些输入值产生不同的结果。数学函数应具有确定性,并应产生一致且可重复的结果


这是一个bug还是一个功能?

我发现了以下bug报告:

它非常相似,因为它报告了一个浮点操作,在JIT代码和解释代码中返回的结果略有不同


该问题已标记为错误,并已修复。在此基础上,我认为您看到的也是一个bug,应该向Oracle报告。

这是一个bug。我向ORACLE()报告了它,它被接受并在Java9中修复