This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug math/2678] New: pow returns incorrect results on underflow


pow(-DBL_MIN, 3) should be -0; similarly, pow(-DBL_MAX, -3) should be -0.  glibc
gets the sign of the 0 wrong here and in some such cases with large integer
exponent wrongly returns NaN.  Tested with current CVS glibc on
i686-pc-linux-gnu, originally seen on PowerPC in testing an earlier glibc
version with the ucbtest testsuite.

I'll attach a testsuite patch that adds some tests for these cases to illustrate
the problem.  (There are already such tests where the first argument of pow is
actually -0 or -infinity rather than -DBL_MIN or -DBL_MAX.)  This shows failures
such as in test-float.out (test-double.out, test-ldouble.out similar):
Failure: Test: pow (-min_value, 3) == -0
Result:
 is:          0.00000000000000000000e+00   0x0.00000000000000000000p+0
 should be:  -0.00000000000000000000e+00  -0x0.00000000000000000000p+0
 difference:  0.00000000000000000000e+00   0x0.00000000000000000000p+0
 ulp       :  0.0000
 max.ulp   :  0.0000
Failure: Test: pow (-min_value, 16777215) == -0
Result:
 is:          0.00000000000000000000e+00   0x0.00000000000000000000p+0
 should be:  -0.00000000000000000000e+00  -0x0.00000000000000000000p+0
 difference:  0.00000000000000000000e+00   0x0.00000000000000000000p+0
 ulp       :  0.0000
 max.ulp   :  0.0000
Failure: pow (-min_value, 1e10) == 0.0: Exception "Invalid operation" set
Failure: Test: pow (-min_value, 1e10) == 0.0
Result:
 is:          nan   nan
 should be:   0.00000000000000000000e+00   0x0.00000000000000000000p+0
Failure: pow (-min_value, 1e20) == 0.0: Exception "Invalid operation" set
Failure: Test: pow (-min_value, 1e20) == 0.0
Result:
 is:          nan   nan
 should be:   0.00000000000000000000e+00   0x0.00000000000000000000p+0
Failure: Test: pow (-max_value, -3) == -0
Result:
 is:          0.00000000000000000000e+00   0x0.00000000000000000000p+0
 should be:  -0.00000000000000000000e+00  -0x0.00000000000000000000p+0
 difference:  0.00000000000000000000e+00   0x0.00000000000000000000p+0
 ulp       :  0.0000
 max.ulp   :  0.0000
Failure: Test: pow (-max_value, -16777215) == -0
Result:
 is:          0.00000000000000000000e+00   0x0.00000000000000000000p+0
 should be:  -0.00000000000000000000e+00  -0x0.00000000000000000000p+0
 difference:  0.00000000000000000000e+00   0x0.00000000000000000000p+0
 ulp       :  0.0000
 max.ulp   :  0.0000
Failure: pow (-max_value, -1e10) == 0.0: Exception "Invalid operation" set
Failure: Test: pow (-max_value, -1e10) == 0.0
Result:
 is:          nan   nan
 should be:   0.00000000000000000000e+00   0x0.00000000000000000000p+0
Failure: pow (-max_value, -1e20) == 0.0: Exception "Invalid operation" set
Failure: Test: pow (-max_value, -1e20) == 0.0
Result:
 is:          nan   nan
 should be:   0.00000000000000000000e+00   0x0.00000000000000000000p+0

-- 
           Summary: pow returns incorrect results on underflow
           Product: glibc
           Version: 2.4
            Status: NEW
          Severity: normal
          Priority: P2
         Component: math
        AssignedTo: aj at suse dot de
        ReportedBy: jsm28 at gcc dot gnu dot org
                CC: glibc-bugs at sources dot redhat dot com


http://sourceware.org/bugzilla/show_bug.cgi?id=2678

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]