You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Sebb (JIRA)" <ji...@apache.org> on 2011/01/23 12:02:48 UTC

[jira] Created: (MATH-499) FastMath nextAfter(double,double) bugs with special doubles

FastMath nextAfter(double,double) bugs with special doubles
-----------------------------------------------------------

                 Key: MATH-499
                 URL: https://issues.apache.org/jira/browse/MATH-499
             Project: Commons Math
          Issue Type: Bug
    Affects Versions: 2.2, 3.0
         Environment: Java 1.6
            Reporter: Sebb
            Assignee: Sebb


nextAfter(double, double) is added in StrictMath 1.6, so one needs to test with Java 1.6 to see thi.

There are various boundary errors with nextAfter(double, double) - see below.

I think these are partially due to missing checks for special cases (e.g. the NaNs), and partially due to the following code:

{code}
if (d * (direction - d) >= 0) {
// we should increase the mantissa
{code}

This appears to be a shorthand for

{code}
if ((d >=0) && (direction >= d))) {
// we should increase the mantissa
{code}

however the expression (direction - d) overlows for some double values, thus causing the wrong branch to be taken.

double nextAfter(-0.0, -0.0) expected -0.0 actual 4.9E-324 entries [1, 1]
double nextAfter(-0.0, 0.0) expected 0.0 actual 4.9E-324 entries [1, 2]
double nextAfter(-0.0, NaN) expected NaN actual 4.9E-324 entries [1, 3]
double nextAfter(0.0, -0.0) expected -0.0 actual 4.9E-324 entries [2, 1]
double nextAfter(0.0, 0.0) expected 0.0 actual 4.9E-324 entries [2, 2]
double nextAfter(0.0, NaN) expected NaN actual 4.9E-324 entries [2, 3]
double nextAfter(-Infinity, NaN) expected NaN actual -Infinity entries [4, 3]
double nextAfter(Infinity, NaN) expected NaN actual Infinity entries [5, 3]
double nextAfter(-1.7976931348623157E308, NaN) expected NaN actual -1.7976931348623155E308 entries [6, 3]
double nextAfter(1.7976931348623157E308, NaN) expected NaN actual 1.7976931348623155E308 entries [7, 3]
double nextAfter(-1.1102230246251565E-16, NaN) expected NaN actual -1.1102230246251564E-16 entries [8, 3]
double nextAfter(1.1102230246251565E-16, NaN) expected NaN actual 1.1102230246251564E-16 entries [9, 3]
double nextAfter(-2.2250738585072014E-308, -0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 1]
double nextAfter(-2.2250738585072014E-308, 0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 2]
double nextAfter(-2.2250738585072014E-308, NaN) expected NaN actual -2.225073858507201E-308 entries [10, 3]
double nextAfter(-2.2250738585072014E-308, 1.1102230246251565E-16) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 9]
double nextAfter(-2.2250738585072014E-308, 2.2250738585072014E-308) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 11]
double nextAfter(-2.2250738585072014E-308, -4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 12]
double nextAfter(-2.2250738585072014E-308, 4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 13]
double nextAfter(2.2250738585072014E-308, -0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 1]
double nextAfter(2.2250738585072014E-308, 0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 2]
double nextAfter(2.2250738585072014E-308, NaN) expected NaN actual 2.225073858507201E-308 entries [11, 3]
double nextAfter(2.2250738585072014E-308, -1.1102230246251565E-16) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 8]
double nextAfter(2.2250738585072014E-308, -2.2250738585072014E-308) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 10]
double nextAfter(2.2250738585072014E-308, -4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 12]
double nextAfter(2.2250738585072014E-308, 4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 13]
double nextAfter(-4.9E-324, -0.0) expected -0.0 actual -1.0E-323 entries [12, 1]
double nextAfter(-4.9E-324, 0.0) expected -0.0 actual -1.0E-323 entries [12, 2]
double nextAfter(-4.9E-324, NaN) expected NaN actual -0.0 entries [12, 3]
double nextAfter(-4.9E-324, 1.1102230246251565E-16) expected -0.0 actual -1.0E-323 entries [12, 9]
double nextAfter(-4.9E-324, 2.2250738585072014E-308) expected -0.0 actual -1.0E-323 entries [12, 11]
double nextAfter(-4.9E-324, 4.9E-324) expected -0.0 actual -1.0E-323 entries [12, 13]
double nextAfter(4.9E-324, -0.0) expected 0.0 actual 1.0E-323 entries [13, 1]
double nextAfter(4.9E-324, 0.0) expected 0.0 actual 1.0E-323 entries [13, 2]
double nextAfter(4.9E-324, NaN) expected NaN actual 0.0 entries [13, 3]
double nextAfter(4.9E-324, -1.1102230246251565E-16) expected 0.0 actual 1.0E-323 entries [13, 8]
double nextAfter(4.9E-324, -2.2250738585072014E-308) expected 0.0 actual 1.0E-323 entries [13, 10]
double nextAfter(4.9E-324, -4.9E-324) expected 0.0 actual 1.0E-323 entries [13, 12]

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Resolved: (MATH-499) FastMath nextAfter(double,double) bugs with special doubles

Posted by "Sebb (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/MATH-499?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sebb resolved MATH-499.
-----------------------

       Resolution: Fixed
    Fix Version/s: 3.0
                   2.2

Fixed in:

URL: http://svn.apache.org/viewvc?rev=1062387&view=rev
Log:
fixed nextAfter implementations for handling of some special values
fixed the signature of the float version, as the spec is to have a double second argument
moved the existing tests that were used in the former implementation in MathUtils,
fixing them also as two of them were not compliant with the spec for equal numbers
Jira: MATH-478

and

URL: http://svn.apache.org/viewvc?rev=1062385&view=rev
Log:
fixed nextAfter implementations for handling of some special values
fixed the signature of the float version, as the spec is to have a double second argument
moved the existing tests that were used in the former implementation in MathUtils,
fixing them also as two of them were not compliant with the spec for equal numbers
Jira: MATH-478

> FastMath nextAfter(double,double) bugs with special doubles
> -----------------------------------------------------------
>
>                 Key: MATH-499
>                 URL: https://issues.apache.org/jira/browse/MATH-499
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.2, 3.0
>         Environment: Java 1.6
>            Reporter: Sebb
>            Assignee: Sebb
>             Fix For: 2.2, 3.0
>
>
> nextAfter(double, double) is added in StrictMath 1.6, so one needs to test with Java 1.6 to see thi.
> There are various boundary errors with nextAfter(double, double) - see below.
> I think these are partially due to missing checks for special cases (e.g. the NaNs), and partially due to the following code:
> {code}
> if (d * (direction - d) >= 0) {
> // we should increase the mantissa
> {code}
> This appears to be a shorthand for something like:
> {code}
> if (((d >=0) && (direction >= d)) || ((d<0) && (direction <0))) {
> // we should increase the mantissa
> {code}
> however the expression (direction - d) overlows for some double values, thus causing the wrong branch to be taken.
> double nextAfter(-0.0, -0.0) expected -0.0 actual 4.9E-324 entries [1, 1]
> double nextAfter(-0.0, 0.0) expected 0.0 actual 4.9E-324 entries [1, 2]
> double nextAfter(-0.0, NaN) expected NaN actual 4.9E-324 entries [1, 3]
> double nextAfter(0.0, -0.0) expected -0.0 actual 4.9E-324 entries [2, 1]
> double nextAfter(0.0, 0.0) expected 0.0 actual 4.9E-324 entries [2, 2]
> double nextAfter(0.0, NaN) expected NaN actual 4.9E-324 entries [2, 3]
> double nextAfter(-Infinity, NaN) expected NaN actual -Infinity entries [4, 3]
> double nextAfter(Infinity, NaN) expected NaN actual Infinity entries [5, 3]
> double nextAfter(-1.7976931348623157E308, NaN) expected NaN actual -1.7976931348623155E308 entries [6, 3]
> double nextAfter(1.7976931348623157E308, NaN) expected NaN actual 1.7976931348623155E308 entries [7, 3]
> double nextAfter(-1.1102230246251565E-16, NaN) expected NaN actual -1.1102230246251564E-16 entries [8, 3]
> double nextAfter(1.1102230246251565E-16, NaN) expected NaN actual 1.1102230246251564E-16 entries [9, 3]
> double nextAfter(-2.2250738585072014E-308, -0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 1]
> double nextAfter(-2.2250738585072014E-308, 0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 2]
> double nextAfter(-2.2250738585072014E-308, NaN) expected NaN actual -2.225073858507201E-308 entries [10, 3]
> double nextAfter(-2.2250738585072014E-308, 1.1102230246251565E-16) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 9]
> double nextAfter(-2.2250738585072014E-308, 2.2250738585072014E-308) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 11]
> double nextAfter(-2.2250738585072014E-308, -4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 12]
> double nextAfter(-2.2250738585072014E-308, 4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 13]
> double nextAfter(2.2250738585072014E-308, -0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 1]
> double nextAfter(2.2250738585072014E-308, 0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 2]
> double nextAfter(2.2250738585072014E-308, NaN) expected NaN actual 2.225073858507201E-308 entries [11, 3]
> double nextAfter(2.2250738585072014E-308, -1.1102230246251565E-16) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 8]
> double nextAfter(2.2250738585072014E-308, -2.2250738585072014E-308) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 10]
> double nextAfter(2.2250738585072014E-308, -4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 12]
> double nextAfter(2.2250738585072014E-308, 4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 13]
> double nextAfter(-4.9E-324, -0.0) expected -0.0 actual -1.0E-323 entries [12, 1]
> double nextAfter(-4.9E-324, 0.0) expected -0.0 actual -1.0E-323 entries [12, 2]
> double nextAfter(-4.9E-324, NaN) expected NaN actual -0.0 entries [12, 3]
> double nextAfter(-4.9E-324, 1.1102230246251565E-16) expected -0.0 actual -1.0E-323 entries [12, 9]
> double nextAfter(-4.9E-324, 2.2250738585072014E-308) expected -0.0 actual -1.0E-323 entries [12, 11]
> double nextAfter(-4.9E-324, 4.9E-324) expected -0.0 actual -1.0E-323 entries [12, 13]
> double nextAfter(4.9E-324, -0.0) expected 0.0 actual 1.0E-323 entries [13, 1]
> double nextAfter(4.9E-324, 0.0) expected 0.0 actual 1.0E-323 entries [13, 2]
> double nextAfter(4.9E-324, NaN) expected NaN actual 0.0 entries [13, 3]
> double nextAfter(4.9E-324, -1.1102230246251565E-16) expected 0.0 actual 1.0E-323 entries [13, 8]
> double nextAfter(4.9E-324, -2.2250738585072014E-308) expected 0.0 actual 1.0E-323 entries [13, 10]
> double nextAfter(4.9E-324, -4.9E-324) expected 0.0 actual 1.0E-323 entries [13, 12]

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] [Closed] (MATH-499) FastMath nextAfter(double,double) bugs with special doubles

Posted by "Luc Maisonobe (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/MATH-499?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Luc Maisonobe closed MATH-499.
------------------------------


Closing issue as it was included in version 2.2, which has been released

> FastMath nextAfter(double,double) bugs with special doubles
> -----------------------------------------------------------
>
>                 Key: MATH-499
>                 URL: https://issues.apache.org/jira/browse/MATH-499
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.2, 3.0
>         Environment: Java 1.6
>            Reporter: Sebb
>            Assignee: Sebb
>             Fix For: 2.2, 3.0
>
>
> nextAfter(double, double) is added in StrictMath 1.6, so one needs to test with Java 1.6 to see thi.
> There are various boundary errors with nextAfter(double, double) - see below.
> I think these are partially due to missing checks for special cases (e.g. the NaNs), and partially due to the following code:
> {code}
> if (d * (direction - d) >= 0) {
> // we should increase the mantissa
> {code}
> This appears to be a shorthand for something like:
> {code}
> if (((d >=0) && (direction >= d)) || ((d<0) && (direction <0))) {
> // we should increase the mantissa
> {code}
> however the expression (direction - d) overlows for some double values, thus causing the wrong branch to be taken.
> double nextAfter(-0.0, -0.0) expected -0.0 actual 4.9E-324 entries [1, 1]
> double nextAfter(-0.0, 0.0) expected 0.0 actual 4.9E-324 entries [1, 2]
> double nextAfter(-0.0, NaN) expected NaN actual 4.9E-324 entries [1, 3]
> double nextAfter(0.0, -0.0) expected -0.0 actual 4.9E-324 entries [2, 1]
> double nextAfter(0.0, 0.0) expected 0.0 actual 4.9E-324 entries [2, 2]
> double nextAfter(0.0, NaN) expected NaN actual 4.9E-324 entries [2, 3]
> double nextAfter(-Infinity, NaN) expected NaN actual -Infinity entries [4, 3]
> double nextAfter(Infinity, NaN) expected NaN actual Infinity entries [5, 3]
> double nextAfter(-1.7976931348623157E308, NaN) expected NaN actual -1.7976931348623155E308 entries [6, 3]
> double nextAfter(1.7976931348623157E308, NaN) expected NaN actual 1.7976931348623155E308 entries [7, 3]
> double nextAfter(-1.1102230246251565E-16, NaN) expected NaN actual -1.1102230246251564E-16 entries [8, 3]
> double nextAfter(1.1102230246251565E-16, NaN) expected NaN actual 1.1102230246251564E-16 entries [9, 3]
> double nextAfter(-2.2250738585072014E-308, -0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 1]
> double nextAfter(-2.2250738585072014E-308, 0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 2]
> double nextAfter(-2.2250738585072014E-308, NaN) expected NaN actual -2.225073858507201E-308 entries [10, 3]
> double nextAfter(-2.2250738585072014E-308, 1.1102230246251565E-16) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 9]
> double nextAfter(-2.2250738585072014E-308, 2.2250738585072014E-308) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 11]
> double nextAfter(-2.2250738585072014E-308, -4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 12]
> double nextAfter(-2.2250738585072014E-308, 4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 13]
> double nextAfter(2.2250738585072014E-308, -0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 1]
> double nextAfter(2.2250738585072014E-308, 0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 2]
> double nextAfter(2.2250738585072014E-308, NaN) expected NaN actual 2.225073858507201E-308 entries [11, 3]
> double nextAfter(2.2250738585072014E-308, -1.1102230246251565E-16) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 8]
> double nextAfter(2.2250738585072014E-308, -2.2250738585072014E-308) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 10]
> double nextAfter(2.2250738585072014E-308, -4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 12]
> double nextAfter(2.2250738585072014E-308, 4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 13]
> double nextAfter(-4.9E-324, -0.0) expected -0.0 actual -1.0E-323 entries [12, 1]
> double nextAfter(-4.9E-324, 0.0) expected -0.0 actual -1.0E-323 entries [12, 2]
> double nextAfter(-4.9E-324, NaN) expected NaN actual -0.0 entries [12, 3]
> double nextAfter(-4.9E-324, 1.1102230246251565E-16) expected -0.0 actual -1.0E-323 entries [12, 9]
> double nextAfter(-4.9E-324, 2.2250738585072014E-308) expected -0.0 actual -1.0E-323 entries [12, 11]
> double nextAfter(-4.9E-324, 4.9E-324) expected -0.0 actual -1.0E-323 entries [12, 13]
> double nextAfter(4.9E-324, -0.0) expected 0.0 actual 1.0E-323 entries [13, 1]
> double nextAfter(4.9E-324, 0.0) expected 0.0 actual 1.0E-323 entries [13, 2]
> double nextAfter(4.9E-324, NaN) expected NaN actual 0.0 entries [13, 3]
> double nextAfter(4.9E-324, -1.1102230246251565E-16) expected 0.0 actual 1.0E-323 entries [13, 8]
> double nextAfter(4.9E-324, -2.2250738585072014E-308) expected 0.0 actual 1.0E-323 entries [13, 10]
> double nextAfter(4.9E-324, -4.9E-324) expected 0.0 actual 1.0E-323 entries [13, 12]

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

[jira] Commented: (MATH-499) FastMath nextAfter(double,double) bugs with special doubles

Posted by "Luc Maisonobe (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/MATH-499?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12985302#action_12985302 ] 

Luc Maisonobe commented on MATH-499:
------------------------------------

This should have been fixed in repository this morning.
Do you still see these problems ?

> FastMath nextAfter(double,double) bugs with special doubles
> -----------------------------------------------------------
>
>                 Key: MATH-499
>                 URL: https://issues.apache.org/jira/browse/MATH-499
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.2, 3.0
>         Environment: Java 1.6
>            Reporter: Sebb
>            Assignee: Sebb
>
> nextAfter(double, double) is added in StrictMath 1.6, so one needs to test with Java 1.6 to see thi.
> There are various boundary errors with nextAfter(double, double) - see below.
> I think these are partially due to missing checks for special cases (e.g. the NaNs), and partially due to the following code:
> {code}
> if (d * (direction - d) >= 0) {
> // we should increase the mantissa
> {code}
> This appears to be a shorthand for something like:
> {code}
> if (((d >=0) && (direction >= d)) || ((d<0) && (direction <0))) {
> // we should increase the mantissa
> {code}
> however the expression (direction - d) overlows for some double values, thus causing the wrong branch to be taken.
> double nextAfter(-0.0, -0.0) expected -0.0 actual 4.9E-324 entries [1, 1]
> double nextAfter(-0.0, 0.0) expected 0.0 actual 4.9E-324 entries [1, 2]
> double nextAfter(-0.0, NaN) expected NaN actual 4.9E-324 entries [1, 3]
> double nextAfter(0.0, -0.0) expected -0.0 actual 4.9E-324 entries [2, 1]
> double nextAfter(0.0, 0.0) expected 0.0 actual 4.9E-324 entries [2, 2]
> double nextAfter(0.0, NaN) expected NaN actual 4.9E-324 entries [2, 3]
> double nextAfter(-Infinity, NaN) expected NaN actual -Infinity entries [4, 3]
> double nextAfter(Infinity, NaN) expected NaN actual Infinity entries [5, 3]
> double nextAfter(-1.7976931348623157E308, NaN) expected NaN actual -1.7976931348623155E308 entries [6, 3]
> double nextAfter(1.7976931348623157E308, NaN) expected NaN actual 1.7976931348623155E308 entries [7, 3]
> double nextAfter(-1.1102230246251565E-16, NaN) expected NaN actual -1.1102230246251564E-16 entries [8, 3]
> double nextAfter(1.1102230246251565E-16, NaN) expected NaN actual 1.1102230246251564E-16 entries [9, 3]
> double nextAfter(-2.2250738585072014E-308, -0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 1]
> double nextAfter(-2.2250738585072014E-308, 0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 2]
> double nextAfter(-2.2250738585072014E-308, NaN) expected NaN actual -2.225073858507201E-308 entries [10, 3]
> double nextAfter(-2.2250738585072014E-308, 1.1102230246251565E-16) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 9]
> double nextAfter(-2.2250738585072014E-308, 2.2250738585072014E-308) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 11]
> double nextAfter(-2.2250738585072014E-308, -4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 12]
> double nextAfter(-2.2250738585072014E-308, 4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 13]
> double nextAfter(2.2250738585072014E-308, -0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 1]
> double nextAfter(2.2250738585072014E-308, 0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 2]
> double nextAfter(2.2250738585072014E-308, NaN) expected NaN actual 2.225073858507201E-308 entries [11, 3]
> double nextAfter(2.2250738585072014E-308, -1.1102230246251565E-16) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 8]
> double nextAfter(2.2250738585072014E-308, -2.2250738585072014E-308) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 10]
> double nextAfter(2.2250738585072014E-308, -4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 12]
> double nextAfter(2.2250738585072014E-308, 4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 13]
> double nextAfter(-4.9E-324, -0.0) expected -0.0 actual -1.0E-323 entries [12, 1]
> double nextAfter(-4.9E-324, 0.0) expected -0.0 actual -1.0E-323 entries [12, 2]
> double nextAfter(-4.9E-324, NaN) expected NaN actual -0.0 entries [12, 3]
> double nextAfter(-4.9E-324, 1.1102230246251565E-16) expected -0.0 actual -1.0E-323 entries [12, 9]
> double nextAfter(-4.9E-324, 2.2250738585072014E-308) expected -0.0 actual -1.0E-323 entries [12, 11]
> double nextAfter(-4.9E-324, 4.9E-324) expected -0.0 actual -1.0E-323 entries [12, 13]
> double nextAfter(4.9E-324, -0.0) expected 0.0 actual 1.0E-323 entries [13, 1]
> double nextAfter(4.9E-324, 0.0) expected 0.0 actual 1.0E-323 entries [13, 2]
> double nextAfter(4.9E-324, NaN) expected NaN actual 0.0 entries [13, 3]
> double nextAfter(4.9E-324, -1.1102230246251565E-16) expected 0.0 actual 1.0E-323 entries [13, 8]
> double nextAfter(4.9E-324, -2.2250738585072014E-308) expected 0.0 actual 1.0E-323 entries [13, 10]
> double nextAfter(4.9E-324, -4.9E-324) expected 0.0 actual 1.0E-323 entries [13, 12]

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (MATH-499) FastMath nextAfter(double,double) bugs with special doubles

Posted by "Sebb (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/MATH-499?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sebb updated MATH-499:
----------------------

    Description: 
nextAfter(double, double) is added in StrictMath 1.6, so one needs to test with Java 1.6 to see thi.

There are various boundary errors with nextAfter(double, double) - see below.

I think these are partially due to missing checks for special cases (e.g. the NaNs), and partially due to the following code:

{code}
if (d * (direction - d) >= 0) {
// we should increase the mantissa
{code}

This appears to be a shorthand for something like:

{code}
if (((d >=0) && (direction >= d)) || ((d<0) && (direction <0))) {
// we should increase the mantissa
{code}

however the expression (direction - d) overlows for some double values, thus causing the wrong branch to be taken.

double nextAfter(-0.0, -0.0) expected -0.0 actual 4.9E-324 entries [1, 1]
double nextAfter(-0.0, 0.0) expected 0.0 actual 4.9E-324 entries [1, 2]
double nextAfter(-0.0, NaN) expected NaN actual 4.9E-324 entries [1, 3]
double nextAfter(0.0, -0.0) expected -0.0 actual 4.9E-324 entries [2, 1]
double nextAfter(0.0, 0.0) expected 0.0 actual 4.9E-324 entries [2, 2]
double nextAfter(0.0, NaN) expected NaN actual 4.9E-324 entries [2, 3]
double nextAfter(-Infinity, NaN) expected NaN actual -Infinity entries [4, 3]
double nextAfter(Infinity, NaN) expected NaN actual Infinity entries [5, 3]
double nextAfter(-1.7976931348623157E308, NaN) expected NaN actual -1.7976931348623155E308 entries [6, 3]
double nextAfter(1.7976931348623157E308, NaN) expected NaN actual 1.7976931348623155E308 entries [7, 3]
double nextAfter(-1.1102230246251565E-16, NaN) expected NaN actual -1.1102230246251564E-16 entries [8, 3]
double nextAfter(1.1102230246251565E-16, NaN) expected NaN actual 1.1102230246251564E-16 entries [9, 3]
double nextAfter(-2.2250738585072014E-308, -0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 1]
double nextAfter(-2.2250738585072014E-308, 0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 2]
double nextAfter(-2.2250738585072014E-308, NaN) expected NaN actual -2.225073858507201E-308 entries [10, 3]
double nextAfter(-2.2250738585072014E-308, 1.1102230246251565E-16) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 9]
double nextAfter(-2.2250738585072014E-308, 2.2250738585072014E-308) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 11]
double nextAfter(-2.2250738585072014E-308, -4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 12]
double nextAfter(-2.2250738585072014E-308, 4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 13]
double nextAfter(2.2250738585072014E-308, -0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 1]
double nextAfter(2.2250738585072014E-308, 0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 2]
double nextAfter(2.2250738585072014E-308, NaN) expected NaN actual 2.225073858507201E-308 entries [11, 3]
double nextAfter(2.2250738585072014E-308, -1.1102230246251565E-16) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 8]
double nextAfter(2.2250738585072014E-308, -2.2250738585072014E-308) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 10]
double nextAfter(2.2250738585072014E-308, -4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 12]
double nextAfter(2.2250738585072014E-308, 4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 13]
double nextAfter(-4.9E-324, -0.0) expected -0.0 actual -1.0E-323 entries [12, 1]
double nextAfter(-4.9E-324, 0.0) expected -0.0 actual -1.0E-323 entries [12, 2]
double nextAfter(-4.9E-324, NaN) expected NaN actual -0.0 entries [12, 3]
double nextAfter(-4.9E-324, 1.1102230246251565E-16) expected -0.0 actual -1.0E-323 entries [12, 9]
double nextAfter(-4.9E-324, 2.2250738585072014E-308) expected -0.0 actual -1.0E-323 entries [12, 11]
double nextAfter(-4.9E-324, 4.9E-324) expected -0.0 actual -1.0E-323 entries [12, 13]
double nextAfter(4.9E-324, -0.0) expected 0.0 actual 1.0E-323 entries [13, 1]
double nextAfter(4.9E-324, 0.0) expected 0.0 actual 1.0E-323 entries [13, 2]
double nextAfter(4.9E-324, NaN) expected NaN actual 0.0 entries [13, 3]
double nextAfter(4.9E-324, -1.1102230246251565E-16) expected 0.0 actual 1.0E-323 entries [13, 8]
double nextAfter(4.9E-324, -2.2250738585072014E-308) expected 0.0 actual 1.0E-323 entries [13, 10]
double nextAfter(4.9E-324, -4.9E-324) expected 0.0 actual 1.0E-323 entries [13, 12]

  was:
nextAfter(double, double) is added in StrictMath 1.6, so one needs to test with Java 1.6 to see thi.

There are various boundary errors with nextAfter(double, double) - see below.

I think these are partially due to missing checks for special cases (e.g. the NaNs), and partially due to the following code:

{code}
if (d * (direction - d) >= 0) {
// we should increase the mantissa
{code}

This appears to be a shorthand for

{code}
if ((d >=0) && (direction >= d))) {
// we should increase the mantissa
{code}

however the expression (direction - d) overlows for some double values, thus causing the wrong branch to be taken.

double nextAfter(-0.0, -0.0) expected -0.0 actual 4.9E-324 entries [1, 1]
double nextAfter(-0.0, 0.0) expected 0.0 actual 4.9E-324 entries [1, 2]
double nextAfter(-0.0, NaN) expected NaN actual 4.9E-324 entries [1, 3]
double nextAfter(0.0, -0.0) expected -0.0 actual 4.9E-324 entries [2, 1]
double nextAfter(0.0, 0.0) expected 0.0 actual 4.9E-324 entries [2, 2]
double nextAfter(0.0, NaN) expected NaN actual 4.9E-324 entries [2, 3]
double nextAfter(-Infinity, NaN) expected NaN actual -Infinity entries [4, 3]
double nextAfter(Infinity, NaN) expected NaN actual Infinity entries [5, 3]
double nextAfter(-1.7976931348623157E308, NaN) expected NaN actual -1.7976931348623155E308 entries [6, 3]
double nextAfter(1.7976931348623157E308, NaN) expected NaN actual 1.7976931348623155E308 entries [7, 3]
double nextAfter(-1.1102230246251565E-16, NaN) expected NaN actual -1.1102230246251564E-16 entries [8, 3]
double nextAfter(1.1102230246251565E-16, NaN) expected NaN actual 1.1102230246251564E-16 entries [9, 3]
double nextAfter(-2.2250738585072014E-308, -0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 1]
double nextAfter(-2.2250738585072014E-308, 0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 2]
double nextAfter(-2.2250738585072014E-308, NaN) expected NaN actual -2.225073858507201E-308 entries [10, 3]
double nextAfter(-2.2250738585072014E-308, 1.1102230246251565E-16) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 9]
double nextAfter(-2.2250738585072014E-308, 2.2250738585072014E-308) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 11]
double nextAfter(-2.2250738585072014E-308, -4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 12]
double nextAfter(-2.2250738585072014E-308, 4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 13]
double nextAfter(2.2250738585072014E-308, -0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 1]
double nextAfter(2.2250738585072014E-308, 0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 2]
double nextAfter(2.2250738585072014E-308, NaN) expected NaN actual 2.225073858507201E-308 entries [11, 3]
double nextAfter(2.2250738585072014E-308, -1.1102230246251565E-16) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 8]
double nextAfter(2.2250738585072014E-308, -2.2250738585072014E-308) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 10]
double nextAfter(2.2250738585072014E-308, -4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 12]
double nextAfter(2.2250738585072014E-308, 4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 13]
double nextAfter(-4.9E-324, -0.0) expected -0.0 actual -1.0E-323 entries [12, 1]
double nextAfter(-4.9E-324, 0.0) expected -0.0 actual -1.0E-323 entries [12, 2]
double nextAfter(-4.9E-324, NaN) expected NaN actual -0.0 entries [12, 3]
double nextAfter(-4.9E-324, 1.1102230246251565E-16) expected -0.0 actual -1.0E-323 entries [12, 9]
double nextAfter(-4.9E-324, 2.2250738585072014E-308) expected -0.0 actual -1.0E-323 entries [12, 11]
double nextAfter(-4.9E-324, 4.9E-324) expected -0.0 actual -1.0E-323 entries [12, 13]
double nextAfter(4.9E-324, -0.0) expected 0.0 actual 1.0E-323 entries [13, 1]
double nextAfter(4.9E-324, 0.0) expected 0.0 actual 1.0E-323 entries [13, 2]
double nextAfter(4.9E-324, NaN) expected NaN actual 0.0 entries [13, 3]
double nextAfter(4.9E-324, -1.1102230246251565E-16) expected 0.0 actual 1.0E-323 entries [13, 8]
double nextAfter(4.9E-324, -2.2250738585072014E-308) expected 0.0 actual 1.0E-323 entries [13, 10]
double nextAfter(4.9E-324, -4.9E-324) expected 0.0 actual 1.0E-323 entries [13, 12]


> FastMath nextAfter(double,double) bugs with special doubles
> -----------------------------------------------------------
>
>                 Key: MATH-499
>                 URL: https://issues.apache.org/jira/browse/MATH-499
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.2, 3.0
>         Environment: Java 1.6
>            Reporter: Sebb
>            Assignee: Sebb
>
> nextAfter(double, double) is added in StrictMath 1.6, so one needs to test with Java 1.6 to see thi.
> There are various boundary errors with nextAfter(double, double) - see below.
> I think these are partially due to missing checks for special cases (e.g. the NaNs), and partially due to the following code:
> {code}
> if (d * (direction - d) >= 0) {
> // we should increase the mantissa
> {code}
> This appears to be a shorthand for something like:
> {code}
> if (((d >=0) && (direction >= d)) || ((d<0) && (direction <0))) {
> // we should increase the mantissa
> {code}
> however the expression (direction - d) overlows for some double values, thus causing the wrong branch to be taken.
> double nextAfter(-0.0, -0.0) expected -0.0 actual 4.9E-324 entries [1, 1]
> double nextAfter(-0.0, 0.0) expected 0.0 actual 4.9E-324 entries [1, 2]
> double nextAfter(-0.0, NaN) expected NaN actual 4.9E-324 entries [1, 3]
> double nextAfter(0.0, -0.0) expected -0.0 actual 4.9E-324 entries [2, 1]
> double nextAfter(0.0, 0.0) expected 0.0 actual 4.9E-324 entries [2, 2]
> double nextAfter(0.0, NaN) expected NaN actual 4.9E-324 entries [2, 3]
> double nextAfter(-Infinity, NaN) expected NaN actual -Infinity entries [4, 3]
> double nextAfter(Infinity, NaN) expected NaN actual Infinity entries [5, 3]
> double nextAfter(-1.7976931348623157E308, NaN) expected NaN actual -1.7976931348623155E308 entries [6, 3]
> double nextAfter(1.7976931348623157E308, NaN) expected NaN actual 1.7976931348623155E308 entries [7, 3]
> double nextAfter(-1.1102230246251565E-16, NaN) expected NaN actual -1.1102230246251564E-16 entries [8, 3]
> double nextAfter(1.1102230246251565E-16, NaN) expected NaN actual 1.1102230246251564E-16 entries [9, 3]
> double nextAfter(-2.2250738585072014E-308, -0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 1]
> double nextAfter(-2.2250738585072014E-308, 0.0) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 2]
> double nextAfter(-2.2250738585072014E-308, NaN) expected NaN actual -2.225073858507201E-308 entries [10, 3]
> double nextAfter(-2.2250738585072014E-308, 1.1102230246251565E-16) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 9]
> double nextAfter(-2.2250738585072014E-308, 2.2250738585072014E-308) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 11]
> double nextAfter(-2.2250738585072014E-308, -4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 12]
> double nextAfter(-2.2250738585072014E-308, 4.9E-324) expected -2.225073858507201E-308 actual -2.225073858507202E-308 entries [10, 13]
> double nextAfter(2.2250738585072014E-308, -0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 1]
> double nextAfter(2.2250738585072014E-308, 0.0) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 2]
> double nextAfter(2.2250738585072014E-308, NaN) expected NaN actual 2.225073858507201E-308 entries [11, 3]
> double nextAfter(2.2250738585072014E-308, -1.1102230246251565E-16) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 8]
> double nextAfter(2.2250738585072014E-308, -2.2250738585072014E-308) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 10]
> double nextAfter(2.2250738585072014E-308, -4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 12]
> double nextAfter(2.2250738585072014E-308, 4.9E-324) expected 2.225073858507201E-308 actual 2.225073858507202E-308 entries [11, 13]
> double nextAfter(-4.9E-324, -0.0) expected -0.0 actual -1.0E-323 entries [12, 1]
> double nextAfter(-4.9E-324, 0.0) expected -0.0 actual -1.0E-323 entries [12, 2]
> double nextAfter(-4.9E-324, NaN) expected NaN actual -0.0 entries [12, 3]
> double nextAfter(-4.9E-324, 1.1102230246251565E-16) expected -0.0 actual -1.0E-323 entries [12, 9]
> double nextAfter(-4.9E-324, 2.2250738585072014E-308) expected -0.0 actual -1.0E-323 entries [12, 11]
> double nextAfter(-4.9E-324, 4.9E-324) expected -0.0 actual -1.0E-323 entries [12, 13]
> double nextAfter(4.9E-324, -0.0) expected 0.0 actual 1.0E-323 entries [13, 1]
> double nextAfter(4.9E-324, 0.0) expected 0.0 actual 1.0E-323 entries [13, 2]
> double nextAfter(4.9E-324, NaN) expected NaN actual 0.0 entries [13, 3]
> double nextAfter(4.9E-324, -1.1102230246251565E-16) expected 0.0 actual 1.0E-323 entries [13, 8]
> double nextAfter(4.9E-324, -2.2250738585072014E-308) expected 0.0 actual 1.0E-323 entries [13, 10]
> double nextAfter(4.9E-324, -4.9E-324) expected 0.0 actual 1.0E-323 entries [13, 12]

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.