/********************************************************************** * Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. * * All Rights Reserved. * * Reference "/usr/src/COPYRIGHT" for applicable restrictions. * **********************************************************************/ /* SCCSID: @(#)fmod.c 3.0 4/22/86 */ /* (System 5) fmod.c 1.7 */ /*LINTLIBRARY*/ /* * fmod(x, y) returns the remainder of x on division by y, * with the same sign as x, * except that if |y| << |x|, it returns 0. */ #include <math.h> double fmod(x, y) register double x, y; { double d; /* can't be in register because of modf() below */ /* * The next lines determine if |y| is negligible compared to |x|, * without dividing, and without adding values of the same sign. */ d = _ABS(x); if (d - _ABS(y) == d) return (0.0); #ifndef pdp11 /* pdp11 "cc" can't handle cast of double to void */ (void) #endif modf(x/y, &d); /* now it's safe to divide without overflow */ return (x - d * y); }