Fwd: JDK 9 RFR of JDK-8030942: Explicitly state floating-point summation requirements on non-finite inputs

Georgiy Rakov georgiy.rakov at oracle.com
Thu Jul 17 11:33:14 UTC 2014


Hello,

let's consider following excerpt:

  149      * It is possible for intermediate sums of finite values to
  150      * overflow into opposite-signed infinities; if that occurs, the
  151      * final sum will be NaN even if the recorded values are all
  152      * finite.

It says about "intermediate sums". I could suppose it implies those 
intermediate sums which are produced during parallel processing. If my 
supposition is true then:

1) I think it would be good to mention it explicitly because otherwise 
this excerpt could also be interpreted as if it talks about intermediate 
sums produced somehow during sequential processing, I'm not sure if this 
is desirable interpretation.
2) For DoubleSummaryStatistics those intermediate sums are added by 
calling "combine" I suppose, so I think it would be good to specify in 
DoubleSummaryStatistics doc, that turning two opposite-signedinfinities 
into NaN is actually resulted from calling combine().
3) The result produced from sequential and parallel processing could 
differ, say considerably. That is for sequential processing it could be 
+/-INFINITE while for parallel processing - NaN. Would it be good to 
mention it?

Thank you,
Georgiy.

On 16.07.2014 16:37, Paul Sandoz wrote:
>
>
> Begin forwarded message:
>
>> *From: *Joe Darcy <joe.darcy at oracle.com <mailto:joe.darcy at oracle.com>>
>> *Subject: **JDK 9 RFR of JDK-8030942: Explicitly state floating-point 
>> summation requirements on non-finite inputs*
>> *Date: *July 16, 2014 2:29:46 AM GMT+02:00
>> *To: *Core-Libs-Dev <core-libs-dev at openjdk.java.net 
>> <mailto:core-libs-dev at openjdk.java.net>>
>>
>> Hello,
>>
>> Please review my changes to address:
>>
>>    JDK-8030942: Explicitly state floating-point summation 
>> requirements on non-finite inputs
>> http://cr.openjdk.java.net/~darcy/8030942.0/ 
>> <http://cr.openjdk.java.net/%7Edarcy/8030942.0/>
>>
>> Patch below.
>>
>> Thanks,
>>
>> -Joe
>>
>> --- old/src/share/classes/java/util/DoubleSummaryStatistics.java 
>> 2014-07-15 17:26:41.000000000 -0700
>> +++ new/src/share/classes/java/util/DoubleSummaryStatistics.java 
>> 2014-07-15 17:26:41.000000000 -0700
>> @@ -1,5 +1,5 @@
>> /*
>> - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All 
>> rights reserved.
>> + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All 
>> rights reserved.
>>  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>  *
>>  * This code is free software; you can redistribute it and/or modify it
>> @@ -129,9 +129,6 @@
>>      * Returns the sum of values recorded, or zero if no values have been
>>      * recorded.
>>      *
>> -     * If any recorded value is a NaN or the sum is at any point a NaN
>> -     * then the sum will be NaN.
>> -     *
>>      * <p> The value of a floating-point sum is a function both of the
>>      * input values as well as the order of addition operations. The
>>      * order of addition operations of this method is intentionally
>> @@ -143,6 +140,23 @@
>>      * numerical sum compared to a simple summation of {@code double}
>>      * values.
>>      *
>> +     * <p>If any recorded value is a NaN or the intermediate sum is at
>> +     * any point a NaN, then the final sum will be NaN.
>> +     *
>> +     * If the recorded values contain infinities of opposite sign, the
>> +     * final sum will be NaN.
>> +     *
>> +     * It is possible for intermediate sums of finite values to
>> +     * overflow into opposite-signed infinities; if that occurs, the
>> +     * final sum will be NaN even if the recorded values are all
>> +     * finite.
>> +     *
>> +     * If the exact sum is infinite, a properly-signed infinity is
>> +     * returned.
>> +     *
>> +     * If all the recorded values are zero, the sign of zero is
>> +     * <em>not</em> guaranteed to be preserved in the final sum.
>> +     *
>>      * @apiNote Values sorted by increasing absolute magnitude tend 
>> to yield
>>      * more accurate results.
>>      *
>> @@ -193,9 +207,6 @@
>>      * Returns the arithmetic mean of values recorded, or zero if no
>>      * values have been recorded.
>>      *
>> -     * If any recorded value is a NaN or the sum is at any point a NaN
>> -     * then the average will be code NaN.
>> -     *
>>      * <p>The average returned can vary depending upon the order in
>>      * which values are recorded.
>>      *
>> @@ -203,6 +214,10 @@
>>      * other technique to reduce the error bound in the {@link #getSum
>>      * numerical sum} used to compute the average.
>>      *
>> +     * <p>This method can return a NaN or infinite result in the same
>> +     * kind of numerical situations as {@linkplain #getSum() the sum}
>> +     * can be NaN or infinite, respectively.
>> +     *
>>      * @apiNote Values sorted by increasing absolute magnitude tend 
>> to yield
>>      * more accurate results.
>>      *
>> --- old/src/share/classes/java/util/stream/DoubleStream.java 
>> 2014-07-15 17:26:42.000000000 -0700
>> +++ new/src/share/classes/java/util/stream/DoubleStream.java 
>> 2014-07-15 17:26:42.000000000 -0700
>> @@ -1,5 +1,5 @@
>> /*
>> - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All 
>> rights reserved.
>> + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All 
>> rights reserved.
>>  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>  *
>>  * This code is free software; you can redistribute it and/or modify it
>> @@ -470,10 +470,7 @@
>>      * code is not necessarily equivalent to the summation computation
>>      * done by this method.
>>      *
>> -     * <p>If any stream element is a NaN or the sum is at any point 
>> a NaN
>> -     * then the sum will be NaN.
>> -     *
>> -     * The value of a floating-point sum is a function both
>> +     * <p>The value of a floating-point sum is a function both
>>      * of the input values as well as the order of addition
>>      * operations. The order of addition operations of this method is
>>      * intentionally not defined to allow for implementation
>> @@ -485,6 +482,23 @@
>>      * numerical sum compared to a simple summation of {@code double}
>>      * values.
>>      *
>> +     * <p>If any stream element is a NaN or the intermediate sum is at
>> +     * any point a NaN, then the final sum will be NaN.
>> +     *
>> +     * If the stream elements contain infinities of opposite sign, the
>> +     * final sum will be NaN.
>> +     *
>> +     * It is possible for intermediate sums of finite values to
>> +     * overflow into opposite-signed infinities; if that occurs, the
>> +     * final sum will be NaN even if the stream elements are all
>> +     * finite.
>> +     *
>> +     * If the exact sum is infinite, a properly-signed infinity is
>> +     * returned.
>> +     *
>> +     * If all the stream elements are zero, the sign of zero is
>> +     * <em>not</em> guaranteed to be preserved in the final sum.
>> +     *
>>      * <p>This is a <a href="package-summary.html#StreamOps">terminal
>>      * operation</a>.
>>      *
>> @@ -555,9 +569,6 @@
>>      * mean of elements of this stream, or an empty optional if this
>>      * stream is empty.
>>      *
>> -     * If any recorded value is a NaN or the sum is at any point a NaN
>> -     * then the average will be NaN.
>> -     *
>>      * <p>The average returned can vary depending upon the order in
>>      * which values are recorded.
>>      *
>> @@ -565,6 +576,10 @@
>>      * other technique to reduce the error bound in the {@link #sum
>>      * numerical sum} used to compute the average.
>>      *
>> +     * <p>This method can return a NaN or infinite result in the same
>> +     * kind of numerical situations as {@linkplain #sum() the sum} can
>> +     * be NaN or infinite, respectively.
>> +     *
>>      *  <p>The average is a special case of a <a
>>      * href="package-summary.html#Reduction">reduction</a>.
>>      *
>>
>




More information about the core-libs-dev mailing list