...
See FLP03-C. Detect and handle floating-point errors for more details on how to detect floating-point errors.
...
Denormalized Numbers
Certain functions may produce range errors specifically when applied with a denormal argumentdenormalized number. These functions are: asin(), asinh(), atan(), atanh(), and erf(). When evaluated with a denormal argumentdenormalized number, these functions can produce an inexact, denormal valuedenormalized value, which is an underflow error. Subclause 7.12.1, paragraph 6, of the C Standard [ISO/IEC 9899:2011] defines the following behavior for floating-point underflow:
...
| Function | Arguments |
|---|---|
fmod() | ((min+denorm),min) |
remainder() | ((min+denorm),min) |
remquo() | ((min+denorm),min,quo) |
If denormal results denormalized results are supported, the returned value is exact and there will not be a range error. When dealing with fmod(), subclause F.10.7.1, paragraph 2, of the C Standard [ISO/IEC 9899:2011] states:
...
Subclause F.10.7.2, paragraph 2, and subclause F.10.7.3, paragraph 2 of the C Standard [ISO/IEC 9899:2011] cover remainder() and remquo() for when denormal results denormalized results are supported.
Noncompliant Code Example (sqrt())
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <errno.h>
#include <math.h>
#if defined(math_errhandling) \
&& (math_errhandling & MATH_ERREXCEPT)
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
#endif
void func(double x, double y) {
#if defined(math_errhandling) \
&& (math_errhandling & MATH_ERREXCEPT)
feclearexcept(FE_ALL_EXCEPT);
#endif
errno = 0;
double result;
if (((x == 0.0f) && islessequal(y, 0.0)) || isless(x, 0.0)) {
/* Handle domain or pole error */
}
result = pow(x, y);
#if !defined(math_errhandling) \
|| (math_errhandling & MATH_ERRNO)
if (errno != 0) {
/* Handle range error */
}
#endif
#if defined(math_errhandling) \
&& (math_errhandling & MATH_ERREXCEPT)
if (fetestexcept(FE_INVALID
| FE_DIVBYZERO
| FE_OVERFLOW
| FE_UNDERFLOW) != 0) {
/* Handle range error */
}
#endif
} |
Noncompliant Code Example (asin(),
...
Denormalized Number)
This noncompliant code example determines the arcsin of x:
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <math.h>
void func(float x) {
float result = asin(x);
/* ... */
} |
Compliant Soluction (asin(),
...
Denormalized Number)
Because this function has no domain errors but may have range errors, the programmer must detect a range error and act accordingly:
...