【发布时间】:2019-11-18 17:18:09
【问题描述】:
我猜这里 sm 和 sm2 由于浮点限制不相等:
double sm = -1.22 + (0.6027852837247973 + 0.8920332205475238);
double sm2 = -1.22 + 0.6027852837247973 + 0.8920332205475238;
System.out.println("sm = "+sm);
System.out.println("sm2 = "+sm2);
System.out.println("sm-sm2 = "+(sm-sm2));
结果是:
sm = 0.27481850427232124
sm2 = 0.27481850427232113
sm-sm2 = 1.1102230246251565E-16
由于运算顺序,我猜它不为零?
无论如何,在这种情况下我想问的是 - 如何获得与此代码等效的代码:
double r2 = 0;
for(double o : ar){
r2+=o*2;
}
r2 -= k;
功能风格(例如,像这样,但由于是第一次操作,我的输出有问题):
Arrays.stream(ar)
.map(o -> o*2)
.reduce(-k, Double::sum);
【问题讨论】:
-
为什么不只做映射乘法 -> 从零开始求和 -> 从结果中减去?因此,操作顺序与循环相同。
标签: java functional-programming floating-point double precision