Bug 6785 - erf() does not set errno for underflow
Summary: erf() does not set errno for underflow
Alias: None
Product: glibc
Classification: Unclassified
Component: math (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
Depends on:
Reported: 2008-07-30 14:50 UTC by Michael Kerrisk
Modified: 2014-11-28 13:00 UTC (History)
2 users (show)

See Also:
Last reconfirmed:
fweimer: security-

test program (2.71 KB, text/plain)
2008-07-31 08:49 UTC, Michael Kerrisk

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Kerrisk 2008-07-30 14:50:51 UTC
When erf() is given a subnormal argument, it raises an underflow exception. 
However errno is not set.  It 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).
Comment 1 Michael Kerrisk 2008-07-31 08:49:27 UTC
Created attachment 2850 [details]
test program

Sample run showing problem:

$ /tmp/mt_erf subnormal:20
errno == 0
fetestexcept() says:  FE_UNDERFLOW FE_INEXACT
0 FE_UNDERFLOW subnormal
Comment 2 Joseph Myers 2012-02-29 21:04:45 UTC
Confirmed with current sources on both x86 and x86_64.
Comment 3 Joseph Myers 2013-11-28 16:57:35 UTC
It's now documented that errno is only intended to be set to ERANGE for underflow to 0, not for underflow to subnormals, and erf can't underflow to 0 (the result for small x is about x * 2/sqrt(pi)).
Comment 4 Nadezhda Viukova 2014-11-28 13:00:59 UTC
IMHO there is a related bug in gcc. See