Prevent math errors by carefully bounds-checking before calling functions. In particular, the following domain errors should be prevented by prior bounds-checking:
Function | Bounds-checking |
---|---|
acos( x ), asin( x ) | -1 <= x && x <= 1 |
atan2 | x != 0 || y != 0 |
log, log10 | x >= 0 |
pow(x, y) | x != 0 || y > 0 |
sqrt( x ) | x >= 0 |
The calling function should take alternative action if these bounds are violated.
acos(x), asin(x)
Non-Compliant Example
The following code may produce a domain error if the argument is not in the range -1, +1.
Code Block |
---|
float x, result; result = acos(x); |
Compliant Example
The following code uses bounds checking to ensure there is not a domain error.
Code Block |
---|
float x, result; if( x <= -1 || x >= 1){ /* handle domain error */ } result = acos(x); |
atan2
Non-Compliant Solution
The following code may produce a domain error if both x and y are zero.
Code Block |
---|
float x, y, result; result = atan2(y, x); |
Compliant Solution
The following code tests the arguments to ensure that there is not a domain error.
Code Block |
---|
float x, y, result; if( x == 0 && y == 0){ /* handle domain error */ } result = atan2(y, x); |
log, log10
Non-Compliant Example
Code Block |
---|
Compliant Example
Code Block |
---|
pow(x,y)
Non-Compliant Example
The following code may produce a domain error if x is zero and y less than or equal to zero. A range error may also occur if x is zero and y is negative.
Code Block |
---|
float x, y, result; result = pow(x,y); |
Compliant Solution
The following code tests x and y to ensure that there will be no range or domain errors.
Code Block |
---|
float x, y, result; if(x == 0 && y <=0){ /* handle domain error condition */ } result = pow(x, y); |
References
- ISO/IEC 9899-1999 7.12 Mathematics <math.h>
- Plum 91 Topic: 2.10 conv - conversions and overflow