123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /*
- * This file contains math functions missing from the Cephes library.
- *
- * May 22, 2001 Manuel Novoa III
- *
- * Added modf and fmod.
- *
- * TODO:
- * Break out functions into seperate object files as is done
- * by (for example) stdio. Also do this with cephes files.
- */
- #include <math.h>
- #include <errno.h>
- #undef UNK
- /* Set this to nonzero to enable a couple of shortcut tests in fmod. */
- #define SPEED_OVER_SIZE 0
- /**********************************************************************/
- double modf(double x, double *iptr)
- {
- double y;
- #ifdef UNK
- mtherr( "modf", DOMAIN );
- *iptr = NAN;
- return NAN;
- #endif
- #ifdef NANS
- if( isnan(x) ) {
- *iptr = x;
- return x;
- }
- #endif
- #ifdef INFINITIES
- if(!isfinite(x)) {
- *iptr = x; /* Matches glibc, but returning NAN */
- return 0; /* makes more sense to me... */
- }
- #endif
- if (x < 0) { /* Round towards 0. */
- y = ceil(x);
- } else {
- y = floor(x);
- }
- *iptr = y;
- return x - y;
- }
- /**********************************************************************/
- extern double NAN;
- double fmod(double x, double y)
- {
- double z;
- int negative, ex, ey;
- #ifdef UNK
- mtherr( "fmod", DOMAIN );
- return NAN;
- #endif
- #ifdef NANS
- if( isnan(x) || isnan(y) ) {
- errno = EDOM;
- return NAN;
- }
- #endif
- if (y == 0) {
- errno = EDOM;
- return NAN;
- }
- #ifdef INFINITIES
- if(!isfinite(x)) {
- errno = EDOM;
- return NAN;
- }
- #if SPEED_OVER_SIZE
- if(!isfinite(y)) {
- return x;
- }
- #endif
- #endif
- #if SPEED_OVER_SIZE
- if (x == 0) {
- return 0;
- }
- #endif
- negative = 0;
- if (x < 0) {
- negative = 1;
- x = -x;
- }
- if (y < 0) {
- y = -y;
- }
- frexp(y,&ey);
- while (x >= y) {
- frexp(x,&ex);
- z = ldexp(y,ex-ey);
- if (z > x) {
- z /= 2;
- }
- x -= z;
- }
- if (negative) {
- return -x;
- } else {
- return x;
- }
- }
|