Document: WG14 N1398
Submitter: Fred J. Tydeman (USA)
Submission Date: 2009-09-18
Related WG14 documents: N1354, DR 330
Subject: Treatment of math error conditions
Currently, some members of the committee believe that
errno
is undefined, indeterminate, or
unspecified after calling a math function, even if no error
happens. This makes it difficult for application writters to
write robust mathematical software that uses the math library
functions.
In addition, POSIX assumes that errno
will only
be set to non-zero by a math function if an error happens,
and that errno
will be left as 0 if no error
happens.
POSIX XBD: 4.19 Treatment of Error Conditions for Mathematical Functions has:
For all the functions in the <math.h> header, an application wishing to check for error situations should set errno to 0 and call feclearexcept(FE_ALL_EXCEPT) before calling the function. On return, if errno is non-zero or fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW) is non-zero, an error has occurred.
Defect Report 330 changed 7.12.1 paragrpah 1 last sentence to:
Each function shall execute as if it were a single operation without generating any of the exceptions "invalid", "divide-by-zero", or "overflow" except to reflect the result of the function.
Does "single operation" mean that the math functions cannot do "raise(SIGFPE)"? If so, should we make that requirement explicit?
If math errors are being indicated by errno
,
what happens to the floating-point status flags?
If math errors are being indicated by the floating-point
status flags, what happens to errno
?
I propose the following (DO A SEPERATE VOTE ON EACH CHANGE).
In 7.12.1, Treatment of error conditions, 1st paragraph: Add:
errno
shall be unaltered.
(math_errhandling & MATH_ERRNO)
is zero
[footnote], either errno
is unaltered or
errno
acquires the value corresponding to the
error condition.
[Footnote] Math errors are being indicated by the floating-point exception flags.
(math_errhandling & MATH_ERREXCEPT)
is
zero [footnote], either none of the exceptions "invalid",
"divide-by-zero", or "overflow" is raised or the
floating-point exception corresponding to the error
condition is raised.
[Footnote] Math errors are being indicated by
errno
.