|
|
|
Defined in header <math.h> | ||
float fmodf(float x,float y); | (1) | (since C99) |
double fmod(double x,double y); | (2) | |
longdouble fmodl(longdouble x,longdouble y); | (3) | (since C99) |
Defined in header <tgmath.h> | ||
#define fmod( x, y ) | (4) | (since C99) |
fmodl
is called. Otherwise, if any argument has integer type or has typedouble,fmod
is called. Otherwise,fmodf
is called.The floating-point remainder of the division operationx/ y calculated by this function is exactly the valuex- n* y, wheren
isx/ y with its fractional part truncated.
The returned value has the same sign asx and is less or equal toy in magnitude.
Contents |
x, y | - | floating-point values |
If successful, returns the floating-point remainder of the divisionx/ y as defined above.
If a domain error occurs, an implementation-defined value is returned (NaN where supported).
If a range error occurs due to underflow, the correct result (after rounding) is returned.
Errors are reported as specified inmath_errhandling
.
Domain error may occur ify is zero.
If the implementation supports IEEE floating-point arithmetic (IEC 60559):
POSIX requires that a domain error occurs ifx is infinite ory is zero.
fmod
, but notremainder is useful for doing silent wrapping of floating-point types to unsigned integer types:(0.0<=(y= fmod(rint(x),65536.0))? y:65536.0+ y) is in the range[
-0.0,
65535.0]
, which corresponds tounsignedshort, butremainder(rint(x),65536.0) is in the range[
-32767.0,
+32768.0]
, which is outside of the range ofsignedshort.
Thedouble version offmod
behaves as if implemented as follows:
#include <fenv.h>#include <math.h>#include <stdio.h> // #pragma STDC FENV_ACCESS ON int main(void){printf("fmod(+5.1, +3.0) = %.1f\n", fmod(5.1,3));printf("fmod(-5.1, +3.0) = %.1f\n", fmod(-5.1,3));printf("fmod(+5.1, -3.0) = %.1f\n", fmod(5.1,-3));printf("fmod(-5.1, -3.0) = %.1f\n", fmod(-5.1,-3)); // special valuesprintf("fmod(+0.0, 1.0) = %.1f\n", fmod(0,1));printf("fmod(-0.0, 1.0) = %.1f\n", fmod(-0.0,1));printf("fmod(+5.1, Inf) = %.1f\n", fmod(5.1, INFINITY)); // error handlingfeclearexcept(FE_ALL_EXCEPT);printf("fmod(+5.1, 0) = %.1f\n", fmod(5.1,0));if(fetestexcept(FE_INVALID))puts(" FE_INVALID raised");}
Possible output:
fmod(+5.1, +3.0) = 2.1fmod(-5.1, +3.0) = -2.1fmod(+5.1, -3.0) = 2.1fmod(-5.1, -3.0) = -2.1fmod(+0.0, 1.0) = 0.0fmod(-0.0, 1.0) = -0.0fmod(+5.1, Inf) = 5.1fmod(+5.1, 0) = nan FE_INVALID raised
(C99) | computes quotient and remainder of integer division (function)[edit] |
(C99)(C99)(C99) | computes signed remainder of the floating-point division operation (function)[edit] |
(C99)(C99)(C99) | computes signed remainder as well as the three last bits of the division operation (function)[edit] |
C++ documentation forfmod |