Java 使用Stream.reduce的求和反演不正确

Java 使用Stream.reduce的求和反演不正确,java,java-8,java-stream,reduce,Java,Java 8,Java Stream,Reduce,使用Stream.reduce的求和反演不正确,这里出了什么问题 double[] array = {1.0, 2.0}; double iunversionSum = Arrays.stream(array).reduce(0.0, (a, b) -> Double.sum(1.0 / a, 1.0 / b)); 输出为.5,但预期为1.5(1/1+1/2)我认为使用map()可能更简单 double inversionSum = Arrays.stream(arr).map(val

使用Stream.reduce的求和反演不正确,这里出了什么问题

double[] array = {1.0, 2.0};
double iunversionSum = Arrays.stream(array).reduce(0.0, (a, b) -> Double.sum(1.0 / a, 1.0 / b));
输出为.5,但预期为1.5(1/1+1/2)

我认为使用
map()
可能更简单

double inversionSum = Arrays.stream(arr).map(val -> 1 / val).sum();

reduce中的错误是:Double.sum(1.0/a,1.0/b),从0.0开始系列。现在检查一下你的结果是什么


如果您想使用reduce.

@HadiJ或只是
Arrays.stream(array6).map(d->1/d).sum(),请使用Double.sum(a,1.0/b)
@Holger为什么不回答这个问题,或者可能是
Double val=DoubleStream.of(array).map(d->1.0/d).sum()
?@ThomasKläger
(a,b)->Double.sum(a,1.0/b)
不是关联的。@我想,
数组6
不是问题中的数组。一般来说,浮点数学结果取决于顺序,因此,合同必须允许一些小的差异,要考虑双功能联想。否则,
double
操作将无法进行并行计算。@Vipin
DoubleStream.sum()
更精确。继续你的例子
1+½+⅓ + ¼==25/12
DoubleStream.of(1,2,3,4).map(d->1/d).sum()的结果比
for
循环的
结果更接近,事实上,使用
DoubleStream.of(1,2,3,4).map(d->1/d).sum()的值无法接近正确的结果==25.0/12.0
的计算结果为
true
。这是一个有效的解决方案,与for-loop解决方案相比,我担心在这个解决方案中的精度损失:-->double[]数组={1.0,2.0,3.0,4.0};二次倒转sum=0.0;对于(inti=0;ifor
循环更精确。