Bug 6787 - exp10() does not consistently set errno
: exp10() does not consistently set errno
Status: NEW
Product: glibc
Classification: Unclassified
Component: math
: unspecified
: P2 normal
: ---
Assigned To: Not yet assigned to anyone
:
:
:
:
  Show dependency treegraph
 
Reported: 2008-07-30 15:01 UTC by Michael Kerrisk
Modified: 2012-02-29 22:22 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments
test program (11.47 KB, text/plain)
2008-07-31 08:55 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-07-30 15:01:20 UTC
exp10() correctly raises exceptions for overflow and underflow.  However, errno
is only set to ERANGE for the overflow case.  For underflow, it is not set.  It
should also be set to ERANGE in the latter case.

Note also that exp10() is inconsistent with exp2() and exp(), both of which
always set errno for bother underflow and overflow.

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).
Comment 1 Michael Kerrisk 2008-07-31 08:55:03 UTC
Created attachment 2852 [details]
test program

Sample run showing problem.  Note that errno is set for overflow, but not for
underflow.

$ /tmp/mt_exp10 -- -1e5
errno == 0
fetestexcept() says:  FE_UNDERFLOW FE_INEXACT
exp10(-1.00000000000000000e+05)=0.00000000000000000e+00
0 FE_UNDERFLOW +0

$ /tmp/mt_exp10 -- 1e5
errno == ERANGE
fetestexcept() says:  FE_OVERFLOW FE_INEXACT
exp10(1.00000000000000000e+05)=inf
ERANGE FE_OVERFLOW +inf
Comment 2 Joseph Myers 2012-02-29 22:22:37 UTC
Confirmed with current sources on x86 and x86_64 - with the addition that on
x86_64, the UNDERFLOW exception doesn't get raised on underflow.