1 2 /* @(#)w_fmod.c 5.1 93/09/24 */ 3 /* 4 * ==================================================== 5 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 6 * 7 * Developed at SunPro, a Sun Microsystems, Inc. business. 8 * Permission to use, copy, modify, and distribute this 9 * software is freely granted, provided that this notice 10 * is preserved. 11 * ==================================================== 12 */ 13 14 /* 15 FUNCTION 16 <<fmod>>, <<fmodf>>---floating-point remainder (modulo) 17 18 INDEX 19 fmod 20 INDEX 21 fmodf 22 23 ANSI_SYNOPSIS 24 #include <math.h> 25 double fmod(double <[x]>, double <[y]>) 26 float fmodf(float <[x]>, float <[y]>) 27 28 TRAD_SYNOPSIS 29 #include <math.h> 30 double fmod(<[x]>, <[y]>) 31 double (<[x]>, <[y]>); 32 33 float fmodf(<[x]>, <[y]>) 34 float (<[x]>, <[y]>); 35 36 DESCRIPTION 37 The <<fmod>> and <<fmodf>> functions compute the floating-point 38 remainder of <[x]>/<[y]> (<[x]> modulo <[y]>). 39 40 RETURNS 41 The <<fmod>> function returns the value 42 @ifinfo 43 <[x]>-<[i]>*<[y]>, 44 @end ifinfo 45 @tex 46 $x-i\times y$, 47 @end tex 48 for the largest integer <[i]> such that, if <[y]> is nonzero, the 49 result has the same sign as <[x]> and magnitude less than the 50 magnitude of <[y]>. 51 52 <<fmod(<[x]>,0)>> returns NaN, and sets <<errno>> to <<EDOM>>. 53 54 You can modify error treatment for these functions using <<matherr>>. 55 56 PORTABILITY 57 <<fmod>> is ANSI C. <<fmodf>> is an extension. 58 */ 59 60 /* 61 * wrapper fmod(x,y) 62 */ 63 64 #include "fdlibm.h" 65 #include <errno.h> 66 67 #ifndef _DOUBLE_IS_32BITS 68 69 #ifdef __STDC__ fmod(double x,double y)70 double fmod(double x, double y) /* wrapper fmod */ 71 #else 72 double fmod(x,y) /* wrapper fmod */ 73 double x,y; 74 #endif 75 { 76 #ifdef _IEEE_LIBM 77 return __ieee754_fmod(x,y); 78 #else 79 double z; 80 struct exception exc; 81 z = __ieee754_fmod(x,y); 82 if(_LIB_VERSION == _IEEE_ ||isnan(y)||isnan(x)) return z; 83 if(y==0.0) { 84 /* fmod(x,0) */ 85 exc.type = DOMAIN; 86 exc.name = "fmod"; 87 exc.arg1 = x; 88 exc.arg2 = y; 89 exc.err = 0; 90 if (_LIB_VERSION == _SVID_) 91 exc.retval = x; 92 else 93 exc.retval = 0.0/0.0; 94 if (_LIB_VERSION == _POSIX_) 95 errno = EDOM; 96 else if (!matherr(&exc)) { 97 errno = EDOM; 98 } 99 if (exc.err != 0) 100 errno = exc.err; 101 return exc.retval; 102 } else 103 return z; 104 #endif 105 } 106 107 #endif /* defined(_DOUBLE_IS_32BITS) */ 108