code: plan9front

Download patch

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;
-	}
-}