Sources Bugzilla – Bug 6788
expm1() does not set errno on overflow
Last modified: 2010-09-12 06:38:46 UTC
On overflow, expm1() raises an overflow exception (e.g., expm1(1e4) on x86-32),
but does not set errno. For this case, errno should be set to ERANGE.
On error, many glibc math functions both set errno and raise an exception
(fetestexcept(3)). For example, the following function all do this: acos(),
asin(), cosh(), sinh(), acosh(), asinh(), exp(), exp2(), ldexp(), log(),
log10(), log2(). However, there is much inconsistency. Some functions raise an
exception, but don't set errno. Some functions set errno for some errors, but
not others. A few set errno, but don't raise an exception. This series of bug
reports documents deviations from what I consider the ideal: all functions
should BOTH set errno AND raise an exception for all errors.
All of these reports relate to tests on glibc 2.8 (as provided by SUSE 11.0).
Created attachment 2853 [details]
Sample run demonstrating problem (note that raising FE_INVALID here is probably
also a bug):
$ /tmp/mt_expm1 1e5
errno == 0
fetestexcept() says: FE_INVALID FE_OVERFLOW FE_INEXACT
0 FE_OVERFLOW nan
This bug was fixed in glibc 2.10. The man page is updated for man-pages-2.37.
Correcting my earl(In reply to comment #2)
> This bug was fixed in glibc 2.10. The man page is updated for man-pages-2.37.
Correction. It looks like the fix was in 2.11, or possibly 2.12. I have no test
system for 2.11, but 2.12 passes. From the source (sysdeps/i386/fpu/s_expm1.S)
it looks like the changes were in 2.11.