src/share/classes/java/util/stream/DoublePipeline.java
Print this page
*** 377,401 ****
@Override
public final double sum() {
/*
* In the arrays allocated for the collect operation, index 0
! * holds the high-order bits of the running sum and index 1
! * holds the low-order bits of the sum computed via
! * compensated summation.
*/
! double[] summation = collect(() -> new double[2],
(ll, d) -> {
Collectors.sumWithCompensation(ll, d);
},
(ll, rr) -> {
Collectors.sumWithCompensation(ll, rr[0]);
Collectors.sumWithCompensation(ll, rr[1]);
});
! // Better error bounds to add both terms as the final sum
! return summation[0] + summation[1];
}
@Override
public final OptionalDouble min() {
return reduce(Math::min);
--- 377,404 ----
@Override
public final double sum() {
/*
* In the arrays allocated for the collect operation, index 0
! * holds the high-order bits of the running sum, index 1 holds
! * the low-order bits of the sum computed via compensated
! * summation, and index 2 holds the simple sum used to compute
! * the proper result if the stream contains infinite values of
! * the same sign.
*/
! double[] summation = collect(() -> new double[3],
(ll, d) -> {
Collectors.sumWithCompensation(ll, d);
+ ll[2] += d;
},
(ll, rr) -> {
Collectors.sumWithCompensation(ll, rr[0]);
Collectors.sumWithCompensation(ll, rr[1]);
+ ll[2] += rr[2];
});
! return Collectors.computeFinalSum(summation);
}
@Override
public final OptionalDouble min() {
return reduce(Math::min);
*** 419,443 ****
public final OptionalDouble average() {
/*
* In the arrays allocated for the collect operation, index 0
* holds the high-order bits of the running sum, index 1 holds
* the low-order bits of the sum computed via compensated
! * summation, and index 2 holds the number of values seen.
*/
! double[] avg = collect(() -> new double[3],
(ll, d) -> {
ll[2]++;
Collectors.sumWithCompensation(ll, d);
},
(ll, rr) -> {
Collectors.sumWithCompensation(ll, rr[0]);
Collectors.sumWithCompensation(ll, rr[1]);
ll[2] += rr[2];
});
return avg[2] > 0
! // Better error bounds to add both terms as the final sum to compute average
! ? OptionalDouble.of((avg[0] + avg[1]) / avg[2])
: OptionalDouble.empty();
}
@Override
public final long count() {
--- 422,448 ----
public final OptionalDouble average() {
/*
* In the arrays allocated for the collect operation, index 0
* holds the high-order bits of the running sum, index 1 holds
* the low-order bits of the sum computed via compensated
! * summation, index 2 holds the number of values seen, index 3
! * holds the simple sum.
*/
! double[] avg = collect(() -> new double[4],
(ll, d) -> {
ll[2]++;
Collectors.sumWithCompensation(ll, d);
+ ll[3] += d;
},
(ll, rr) -> {
Collectors.sumWithCompensation(ll, rr[0]);
Collectors.sumWithCompensation(ll, rr[1]);
ll[2] += rr[2];
+ ll[3] += rr[3];
});
return avg[2] > 0
! ? OptionalDouble.of(Collectors.computeFinalSum(avg) / avg[2])
: OptionalDouble.empty();
}
@Override
public final long count() {