src/share/classes/java/util/stream/DoublePipeline.java
Print this page
@@ -375,12 +375,19 @@
evaluate(ForEachOps.makeDouble(consumer, true));
}
@Override
public final double sum() {
- // TODO: better algorithm to compensate for errors
- return reduce(0.0, Double::sum);
+ double[] summation = collect(() -> new double[2],
+ (ll, d) -> {
+ Collectors.sumWithCompensation(ll, d);
+ },
+ (ll, rr) -> {
+ Collectors.sumWithCompensation(ll, rr[0]);
+ Collectors.sumWithCompensation(ll, rr[1]);
+ });
+ return summation[0];
}
@Override
public final OptionalDouble min() {
return reduce(Math::min);
@@ -391,21 +398,22 @@
return reduce(Math::max);
}
@Override
public final OptionalDouble average() {
- double[] avg = collect(() -> new double[2],
- (ll, i) -> {
- ll[0]++;
- ll[1] += i;
+ double[] avg = collect(() -> new double[3],
+ (ll, d) -> {
+ ll[2]++;
+ Collectors.sumWithCompensation(ll, d);
},
(ll, rr) -> {
- ll[0] += rr[0];
- ll[1] += rr[1];
+ Collectors.sumWithCompensation(ll, rr[0]);
+ Collectors.sumWithCompensation(ll, rr[1]);
+ ll[2] += rr[2];
});
return avg[0] > 0
- ? OptionalDouble.of(avg[1] / avg[0])
+ ? OptionalDouble.of(avg[0] / avg[2])
: OptionalDouble.empty();
}
@Override
public final long count() {