Java 使用Stream.reduce的求和反演不正确
使用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
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
操作将无法进行并行计算。@VipinDoubleStream.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
循环更精确。