Fwd: JDK 9 RFR of JDK-8030942: Explicitly state floating-point summation requirements on non-finite inputs
Joe Darcy
joe.darcy at oracle.com
Fri Jul 18 16:14:31 UTC 2014
Hello Georgiy,
On 07/18/2014 05:29 AM, Georgiy Rakov wrote:
> Hello Joe,
>
> could you please clarify by short example following assertion:
>
> 154 * If the exact sum is infinite, a properly-signed infinity is
> 155 * returned.
>
> I'm afraid I don't quite understand what you mean here by 'exact sum'.
By "exact sum," the sum absent any floating-point rounding, the sum you
would get using infinite precision to operate on the values in question.
The sentence in question is intended to be a short way of saying "If you
have same-signed infinities in your input, the result will be an
infinity of that sign." In particular, this disallows the behavior that
was fixed before JDK 8 GA where having infinities in the input would
cause a NaN to be returned because of how the compensated summation code
manipulated those values.
HTH,
-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