Bug 6814 - expm1() raises bogus invalid exception
Summary: expm1() raises bogus invalid exception
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: math (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Andreas Jaeger
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-08-04 04:41 UTC by Michael Kerrisk
Modified: 2020-05-23 10:37 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments
test program (2.73 KB, text/plain)
2008-08-04 04:49 UTC, Michael Kerrisk
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Kerrisk 2008-08-04 04:41:39 UTC
For certain large values of x, expm1() returns a bogus FE_INVALID exception and
returns a NaN instead of positive invinity.
Comment 1 Michael Kerrisk 2008-08-04 04:49:03 UTC
Created attachment 2885 [details]
test program
Comment 2 Michael Kerrisk 2008-08-04 04:49:16 UTC
$ /tmp/mt_expm1 1e5
errno == 0
fetestexcept() says:  FE_INVALID FE_OVERFLOW FE_INEXACT
expm1(1.00000000000000000e+05)=nan
0 FE_OVERFLOW nan

$ /tmp/mt_expm1 1.00199970127e5
errno == 0
fetestexcept() says:  FE_INVALID FE_OVERFLOW FE_INEXACT
expm1(1.00199970126999993e+05)=nan
0 FE_OVERFLOW nan

$ /tmp/mt_expm1 1.00199970128e5
errno == 0
fetestexcept() says:  FE_OVERFLOW FE_INEXACT
expm1(1.00199970128000001e+05)=inf
0 FE_OVERFLOW +inf

Comment 3 Michael Kerrisk 2008-08-04 04:50:14 UTC
Comment #2 should have started with thw words: "The first two runs below
demonstrate the problem:"
Comment 4 Joseph Myers 2012-02-29 22:33:42 UTC
This appears to have been fixed, probably by various changes in 2009 (there is a test in the testsuite of expm1 overflow, which will verify there is no such inappropriate exception, and that test was added in 2009).  However, the OVERFLOW exception for expm1 seems to have disappeared on x86, so I've filed bug 13787 for that problem.
Comment 5 Michael Kerrisk 2020-05-23 10:37:50 UTC
Fix documented for man-pages-5.07.

commit fdd3fe51793b75b03ab7e48797e11dc46c935f3b
Author: Michael Kerrisk <mtk.manpages@gmail.com>
Date:   Sat May 23 11:56:12 2020 +0200

    expm1.3: The bogus invalid floating-point exception bug has been fixed
    
    Sometime around 2009 (approximately 2.11) according to
    https://www.sourceware.org/bugzilla/show_bug.cgi?id=6814.
    
    Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>

diff --git a/man3/expm1.3 b/man3/expm1.3
index 460068a6d..8b60c3453 100644
--- a/man3/expm1.3
+++ b/man3/expm1.3
@@ -153,16 +153,16 @@ for some large negative
 .I x
 values (where the function result approaches \-1),
 .PP
-For some large positive
-.I x
-values,
-.BR expm1 ()
-raises a bogus invalid floating-point exception in addition to the expected
-overflow exception, and returns a NaN instead of positive infinity.
-.\" FIXME .
-.\" Bug raised: http://sources.redhat.com/bugzilla/show_bug.cgi?id=6814
+Before approximately glibc version 2.11,
+.\" http://sources.redhat.com/bugzilla/show_bug.cgi?id=6814
 .\" e.g., expm1(1e5) through expm1(1.00199970127e5),
 .\" but not expm1(1.00199970128e5) and beyond.
+.BR expm1 ()
+raised a bogus invalid floating-point exception in addition to the expected
+overflow exception, and returned a NaN instead of positive infinity.
+for some large positive
+.I x
+values,
 .PP
 Before version 2.11,
 .\" It looks like the fix was in 2.11, or possibly 2.12.