java 在所有元素上使用Math.log减少ArrayList

sycxhyv7  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(95)

我有一个浮点数的arrayList,我想对数组中的所有元素使用Math. log方法,然后将它们相加。

var doubleValue = floatArrayList.stream()
        .reduce( 1.0, (a, b) -> Math.log(a) + Math.log(b));

我的结果是doubleValue == NaN
我哪里做错了?

z2acfund

z2acfund1#

这可能就是你想做的。

List<Float> floats = List.of(1.f, 3.f, 2.4f, 5.7f, 10.f);
 
 float d1 = 0;
 for(float d : floats) {
     d1 += Math.log(d);
 }
 System.out.println((double)d1);
 double d2 = floats.stream().reduce(
         0.f,  (a, b) ->a + (float)Math.log(b));
 
 double d3 = floats.stream().parallel().reduce(
         0.f,  (a, b) ->a + (float)Math.log(b), (threadSums, tResult)->threadSums + tResult);
 
 
 System.out.println(d2);
 System.out.println(d3);

印刷品

6.01713228225708
6.01713228225708
6.01713228225708

注意:我之前遇到的主要问题是没有意识到默认的组合器是提供的累加器。下面是源代码:

@Override
public final P_OUT reduce(final P_OUT identity, final BinaryOperator<P_OUT> accumulator) {
        return evaluate(ReduceOps.makeRef(identity, accumulator, accumulator));
}

由于提供的累加器mutates通过取log的值,它也将mutate来自线程的不同结果。

相关问题