我试图测试Math.pow()
的速度,与手动相乘,但遇到了以下错误:
Java运行时环境检测到致命错误:
EXCEPTION_ACCESS_VIOLATION(0xc0000005),pc=0x000000005ac46888,pid=1508,tid=6016
JRE版本:Java(TM) SE Runtime Environment(8.0_25-b18)(构建1.8.0_25-b18)
Java VM:Java HotSpot(TM) 64位Server VM(25.25-b02 mixed mode windows-amd64 compressed oops)
问题所在帧:
V [jvm.dll+0x496888]未能写入核心转储。 在Windows客户端版本中,默认情况下未启用Minidumps。
生成该错误的代码:
long t = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
double val = i*i*i*i*i /* 256 times *i */ *i*i*i;
sum ^= Double.doubleToLongBits(val);
}
System.out.println((System.nanoTime() - t) / 10000000);
我知道这是一个极端的情况,但是这确实是有效的代码,最糟糕的情况应该是值中有无穷大,而不是JRE崩溃。这是否真的是Oracle描述的标准行为,还是只是一个没有人想修复的错误,因为如果你看到了它,你真的是个坏人。
记录一下,使用NetBeans 8.0.2运行。
更新1
看起来问题在于乘数的数量级。
long t = System.nanoTime();
for(int j = 0; j < 10000000; j++) {
int i = j % 50;
double val = i*i*i*i*i /* 256 times *i */ *i*i*i;
sum ^= Double.doubleToLongBits(val);
}
System.out.println((System.nanoTime() - t) / 10000000);
希望一切顺利。
更新2
尝试从控制台运行:
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
并且已经通过了,所以我认为这可能是特定JRE或NetBeans的问题。
javac
编译代码并从命令行运行它呢? - biziclopInf
。这些是整数乘法。您只会得到整数溢出和乘法的整数结果,然后转换为double。这段代码与Math.pow()
无法比较。它不应该失败,但它并不能做到您想要的。我也不理解sum ^=
部分。 - user207421