Compute the floating point remainder
#include <math.h> double remquo( double x, double y, int *quo ); float remquof( float x, float y, int *quo ); long double remquol( long double x, long double y, int *quo );
The remquo(), remquof(), and remquol() functions compute the floating-point remainder of the division operation x / y, as remainder() does. Additionally, they store the sign and at least the three of the last bits of x / y in the location that quo points to, sufficient to determine the octant of the result within a period. The current rounding mode doesn't affect these functions.
These functions are useful when you're using periodic functions where the period is exactly representable as a floating-point value. For example, if you're calculating sin(πx) for a very large x, calling sin() directly may result in a large error; if you first reduce the function's argument with remquo(), you can use the low-order bits of the quotient to determine the sign and the octant of the result within the period, and use the remainder to calculate the value with high precision.
To check for error situations, use feclearexcept() and fetestexcept(). For example:
The floating point remainder r = x - ny, where y is nonzero.
If: | These functions return: | Errors: |
---|---|---|
x is Inf | NaN | FE_INVALID |
x or y is NaN | NaN | — |
x isn't NaN, and y is zero | NaN | FE_INVALID |
These functions raise FE_INEXACT if the FPU reports that the result can't be exactly represented as a floating-point number.
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | No |
Thread | Yes |