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. Background: 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] test program 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 expm1(1.00000000000000000e+05)=nan 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.