下面的Java代码在Cortex-A53上运行时会返回不可预测的结果,特别是在Xperia XA设备上运行。
第一次迭代打印正确的值:
[24,42,61,45,29,46,35,36,48,47,20,64,45,15,37,70,70, 70,70,70,70,70,70,70,70,70,70,70,70,70,70]
经过一些重复后打印出来:
[24,61,29,35,48,20,45,37,1886626217,41137,6952,58489,6151, 55208,154,57100,20418,57100,20148,57100,20418,57100,20418, 57100,201418,57100,20418,57100,20418,57100,20418]
如果我使用float
或double
或int
代替long
,结果仍然错误但不同:
[24.0,61.0,29.0,35.0,48.0,20.0,45.0,37.0,1.0,1.0,1.0,1.0, 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]
在其他设备上,它按预期运行。这是JVM的问题还是由CPU勘误引起的?
public static void runTest() {
long[] t = new long[]{ 23,41, 60, 44, 28, 45, 34, 35, 47, 46, 19, 63, 44, 14, 36, 69};
for(int i = 0; i < 40; i++) {
long[] output = calculate(t);
Log.e("TEST", Arrays.toString(output));
}
}
private static long[] calculate(long[] input) {
long[] result = new long[31];
for (int i = 0; i < 16; i ++) {
for (int j = 0; j < 16; j++) {
result[i + j] = input[i] + 1;
}
}
return result;
}
如果我从calculate
的for循环中移动代码runTest
,它会正确运行。另外,如果我读取input
内的calculate
值,则可以正常工作。
那么,这个问题的原因是什么?我应该在哪里留下反馈来解决这个问题?