| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 1 | /* Portable fmod(x, y) implementation for systems that don't have it */ |
| 2 | |||||
| 3 | #include <math.h> | ||||
| 4 | #include <errno.h> | ||||
| 5 | |||||
| 6 | extern int errno; | ||||
| 7 | |||||
| 8 | double | ||||
| 9 | fmod(x, y) | ||||
| 10 | double x, y; | ||||
| 11 | { | ||||
| 12 | double i, f; | ||||
| 13 | |||||
| 14 | if (y == 0.0) { | ||||
| 15 | errno = EDOM; | ||||
| 16 | return 0.0; | ||||
| 17 | } | ||||
| 18 | |||||
| 19 | /* return f such that x = i*y + f for some integer i | ||||
| 20 | such that |f| < |y| and f has the same sign as x */ | ||||
| 21 | |||||
| 22 | i = floor(x/y); | ||||
| 23 | f = x - i*y; | ||||
| 24 | if ((x < 0.0) != (y < 0.0)) | ||||
| 25 | f = f-y; | ||||
| 26 | return f; | ||||
| 27 | } | ||||