ape/libm: add back fmod, remove modf
We removed the wrong file. Put it back.
This commit is contained in:
parent
988bdd05a3
commit
f76e28cb71
3 changed files with 28 additions and 53 deletions
27
sys/src/ape/lib/ap/math/fmod.c
Normal file
27
sys/src/ape/lib/ap/math/fmod.c
Normal file
|
@ -0,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;
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ OFILES=\
|
||||||
fabs.$O\
|
fabs.$O\
|
||||||
floor.$O\
|
floor.$O\
|
||||||
fmin.$O\
|
fmin.$O\
|
||||||
|
fmod.$O\
|
||||||
gamma.$O\
|
gamma.$O\
|
||||||
hypot.$O\
|
hypot.$O\
|
||||||
j0.$O\
|
j0.$O\
|
||||||
|
|
|
@ -1,53 +0,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;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue