ref: f76e28cb71fd7f45eda35f68c89a6ba151625313
parent: 988bdd05a326687daa1852c9ff395230743b30d8
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jan 23 15:03:07 EST 2021
ape/libm: add back fmod, remove modf We removed the wrong file. Put it back.
--- /dev/null
+++ b/sys/src/ape/lib/ap/math/fmod.c
@@ -1,0 +1,27 @@
+/* floating-point mod function without infinity or NaN checking */
+#include <math.h>
+double
+fmod (double x, double y)
+{
+ int sign = 0, yexp;
+ double r, yfr;
+
+ if (y == 0)
+ return 0;
+ if (y < 0)
+ y = -y;
+ yfr = frexp (y, &yexp);
+ if (x < 0) {
+ sign = 1;
+ r = -x;
+ } else
+ r = x;
+ while (r >= y) {
+ int rexp;
+ double rfr = frexp (r, &rexp);
+ r -= ldexp (y, rexp - yexp - (rfr < yfr));
+ }
+ if (sign)
+ r = -r;
+ return r;
+}
--- a/sys/src/ape/lib/ap/math/mkfile
+++ b/sys/src/ape/lib/ap/math/mkfile
@@ -10,6 +10,7 @@
fabs.$O\
floor.$O\
fmin.$O\
+ fmod.$O\
gamma.$O\
hypot.$O\
j0.$O\
--- a/sys/src/ape/lib/ap/math/modf.c
+++ /dev/null
@@ -1,53 +1,0 @@
-#include <math.h>
-#include <errno.h>
-
-/* modf suitable for IEEE double-precision */
-
-#define MASK 0x7ffL
-#define SIGN 0x80000000
-#define SHIFT 20
-#define BIAS 1022L
-
-typedef union
-{
- double d;
- struct
- {
- long ms;
- long ls;
- } i;
-} Cheat;
-
-double
-modf(double d, double *ip)
-{
- Cheat x;
- int e;
-
- if(-1 < d && d < 1) {
- *ip = 0;
- return d;
- }
- x.d = d;
- x.i.ms &= ~SIGN;
- e = (x.i.ms >> SHIFT) & MASK;
- if(e == MASK || e == 0){
- errno = EDOM;
- *ip = (d > 0)? HUGE_VAL : -HUGE_VAL;
- return 0;
- }
- e -= BIAS;
- if(e <= SHIFT+1) {
- x.i.ms &= ~(0x1fffffL >> e);
- x.i.ls = 0;
- } else
- if(e <= SHIFT+33)
- x.i.ls &= ~(0x7fffffffL >> (e-SHIFT-2));
- if(d > 0){
- *ip = x.d;
- return d - x.d;
- }else{
- *ip = -x.d;
- return d + x.d;
- }
-}