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\
|
||||
floor.$O\
|
||||
fmin.$O\
|
||||
fmod.$O\
|
||||
gamma.$O\
|
||||
hypot.$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