Files
retrobsd/src/libc/gen/ldexp.c
2014-04-09 14:27:18 +01:00

47 lines
626 B
C

#include <math.h>
double
ldexp(fr, exp)
double fr;
int exp;
{
double huge = 1.701411834604692293e38;
int neg;
int i;
neg = 0;
if (fr < 0) {
fr = -fr;
neg = 1;
}
fr = frexp(fr, &i);
while (fr < 0.5) {
fr = 2*fr;
i = i-1;
}
exp = exp+i;
if (exp > 127) {
if (neg)
return(-huge);
else
return(huge);
}
if (exp < -127)
return(0);
while (exp > 30) {
fr = fr*(1L<<30);
exp = exp-30;
}
while (exp < -30) {
fr = fr/(1L<<30);
exp = exp+30;
}
if (exp > 0)
fr = fr*(1L<<exp);
if (exp < 0)
fr = fr/(1L<<-exp);
if (neg)
fr = -fr;
return(fr);
}