【发布时间】:2018-09-28 13:31:50
【问题描述】:
有两种方法,相同的数组,相同的转换数组元素的公式。方法返回不同的值。
数组大小:
private static final int SIZE = 10000000;
private static final int h = SIZE/2;
第一种方法: 数组填充1,用新公式计算新值
private static float[] method1() {
float arr[] = new float[SIZE];
//array fill with 1,
for (int i = 0; i < arr.length; i++) {
arr[i] = 1;
}
//calulate new values with new formula
for (int i = 0; i < arr.length; i++) {
arr[i] = (float) (i * Math.sin(0.2f + i / 5) *
Math.cos(0.2f + i / 5) *
Math.cos(0.4f + i / 2));
}
//return new value
return arr;
}
第二种方法: 将具有相同长度 arr/2 的数组一分为二, 分别计算每个结果 一次编译回来
private static float[] method2(){
float arr[] = new float[SIZE];
float firstarr[] = new float[h];
float secondarr[] = new float[h];
float result[] = new float[SIZE];
for (int i = 0; i <arr.length ; i++) {
arr[i] = 1;
}
//Devide array in two with same length arr/2,
System.arraycopy(arr, 0, firstarr, 0, h);
System.arraycopy(arr, h, secondarr, 0, h);
for (int i = 0; i < firstarr.length; i++) {
firstarr[i] = (float) (i * Math.sin(0.2f + i / 5) *
Math.cos(0.2f + i / 5) *
Math.cos(0.4f + i / 2));
}
for (int i = 0; i < secondarr.length; i++) {
secondarr[i] = (float) (i * Math.sin(0.2f + i / 5)
* Math.cos(0.2f + i / 5)
* Math.cos(0.4f + i / 2));
}
//compile back in one
System.arraycopy(firstarr, 0, result, 0, h);
System.arraycopy(secondarr, 0, result, h, h);
// return result
return result;
}
计算数量数组元素
private static long amount(float[] arr){
long result = 0;
for (int i = 0; i <arr.length ; i++) {
result += arr[i];
}
return result;
}
public static void main(String[] args) {
System.out.println(amount(method1()));// ammount for first method: 22527562
System.out.println(amount(method2())); // ammount for second method: -20047478
}}
Method1 和 Method2 的结果应该相同。 我在哪里犯了错误?为什么返回值不同?
【问题讨论】:
-
需要深度调试:)
-
也许你的错误在这里 System.arraycopy(firstarr, 0, result, 0, h); System.arraycopy(secondarr, 0, result, h, h); 你有 h,h,我注意到你在其他地方没有相同的模式
-
h - size array/2 private static final int h = SIZE/2;
-
@ProgrammingNewb 那部分似乎是正确的。
System.arraycopy(src, srcPos, dest, destPos, length)是该方法的签名