RFR 8214761 : Bug in parallel Kahan summation implementation

Ivan Gerasimov ivan.gerasimov at oracle.com
Mon Dec 10 03:37:39 UTC 2018


DoubleSummaryStatistics takes advantage of Kahan summation algorithm to 
reduce the error of the total sum.

Internally it maintains a field double sumCompensation, which keeps 
lower bits (which were rounded off) of the last addition.

Note, that the compensation has to be subtracted from the result to add 
those bits back:

  166     private void sumWithCompensation(double value) {
  167         double tmp = value - sumCompensation;
  168         double velvel = sum + tmp; // Little wolf of rounding error
  169         sumCompensation = (velvel - sum) - tmp;
  170         sum = velvel;
  171     }

At the line 169, tmp normally has more lower bits than (velvel - sum).

However, when two DoubleSummaryStatistics objects are combined, this 
compensation part is *added* to the total, which may result in a less 
accurate result.

The same bug is replicated in DoubleStreams.

Would you please help review the fix?

BUGURL: https://bugs.openjdk.java.net/browse/JDK-8214761
WEBREV: http://cr.openjdk.java.net/~igerasim/8214761/00/webrev/

With kind regards,
Ivan Gerasimov

More information about the core-libs-dev mailing list