This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug math/2678] New: pow returns incorrect results on underflow
- From: "jsm28 at gcc dot gnu dot org" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sources dot redhat dot com
- Date: 21 May 2006 00:30:12 -0000
- Subject: [Bug math/2678] New: pow returns incorrect results on underflow
- Reply-to: sourceware-bugzilla at sourceware dot org
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.