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

Joe Darcy joe.darcy at oracle.com
Thu Jul 17 16:51:21 UTC 2014


Hello,

On 07/17/2014 04:33 AM, Georgiy Rakov wrote:
> 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:

Parallel processing is one possible way two intermediate sums can be 
combined, but since the order of summation is intentionally undefined, 
even a serial-only computation can have two intermediate sums being 
combined (as opposed to only combining a new element to an intermediate 
sum).

For example, an allowable implementation of sum() would do pairwise 
combination of successive elements, then add up pairs of pairs, etc., 
until the final sum is reached.

>
> 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().

I don't think such detail is necessary or helpful.

You can get opposite signed infinities as values in the input. Or you 
can get opposite signed infinities from being given one infinity as a 
starting value and then getting the other infinity from overflow. Or you 
can get both infinities from overflow.

I don't think drawing too much distinction between these cases is needed.


> 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?

The methods already state something like:

  132      * <p> The value of a floating-point sum is a function both of the
  133      * input values as well as the order of addition operations. The
  134      * order of addition operations of this method is intentionally
  135      * not defined to allow for implementation flexibility to improve
  136      * the speed and accuracy of the computed result.

Parallel vs serial is only one possible source of the differences that 
the specification allows; I don't think it is worthwhile calling it out 
specially.

-Joe

>
> 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