Bug 6784 - fmod() inconsistently sets errno on domain error
Summary: fmod() inconsistently sets errno on domain error
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-07-30 12:29 UTC by Michael Kerrisk
Modified: 2014-07-04 05:46 UTC (History)
1 user (show)

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


Attachments
test program (2.74 KB, text/plain)
2008-07-31 08:46 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 12:29:26 UTC
The calls fmod(x, 0) and fmod(inf, y) should both result in a domain
error.

For both of these calls, an invalid exception is correctly raised.

However, errno is not set consistently.  fmod(x, 0) does (correctly) set
errno to EDOM.  However, fmod(inf, y) does not set errno; it should do so.

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:46:07 UTC
Created attachment 2849 [details]
test program

See also http://sourceware.org/bugzilla/show_bug.cgi?id=6783

sample runs showing problem.  Note that EDOM is set in one case, but not the
other.

$ /tmp/mt_fmod -- inf 1
errno == 0
fetestexcept() says:  FE_INVALID
fmod(inf,1.00000000000000000e+00)=nan
0 FE_INVALID nan

$ /tmp/mt_fmod -- 1 0
errno == EDOM
fetestexcept() says:  FE_INVALID
fmod(1.00000000000000000e+00,0.00000000000000000e+00)=nan
EDOM FE_INVALID nan
Comment 2 Michael Kerrisk 2010-09-11 15:47:34 UTC
This bug was fixed in glibc 2.10. The man page is updated for man-pages-2.37.