如果我测试以下代码,则会得到一些奇怪的结果。我知道double存在问题,因为2.1在IEEE-754中不是2.1。但是,难道不是所有这些都一样吗?前三个给出4.2,最后一个给出4.200000000000001
public static void main(String[] args)
{
double[] arr1 = {0.2, 0.2, 0.2, 0.5, 0.5, 0.5, 2.1};
double[] arr2 = {0.5, 0.5, 0.5, 0.2, 0.2, 0.2, 2.1};
double[] arr3 = {2.1, 0.5, 0.5, 0.5, 0.2, 0.2, 0.2};
double[] arr4 = {2.1, 0.2, 0.2, 0.2, 0.5, 0.5, 0.5};
System.out.println(sumarray(arr1, 0, arr1.length-1));
System.out.println(sumarray(arr2, 0, arr2.length-1));
System.out.println(sumarray(arr3, 0, arr3.length-1));
System.out.println(sumarray(arr4, 0, arr4.length-1));
}
public static double sumarray(double[] arr, int p, int r) {
double sum=arr[p];
for (int k=p+1; k<=r; k++) {
sum = sum + arr[k];
}
return sum;
}
只需将System.out.println()
放在求和循环中,您将看到其中的区别-错误在不同的步骤引入。有时它们会缓解。有时它们无法控制地生长。
0.4
0.6000000000000001
1.1
1.6
2.1
4.2
RES: 4.2
1
1.5
1.7
1.9
2.1
4.2
RES: 4.2
2.6
3.1
3.6
3.8000000000000003
4
4.2
RES: 4.2
2.3000000000000003
2.5000000000000004
2.7000000000000006
3.2000000000000006
3.7000000000000006
4.200000000000001
RES: 4.200000000000001