@@ -770,6 +770,38 @@ real cosh(real const &x) | |||||
return (exp(x) + exp(-x)) >> 1; | return (exp(x) + exp(-x)) >> 1; | ||||
} | } | ||||
real frexp(real const &x, int *exp) | |||||
{ | |||||
if (!x) | |||||
{ | |||||
*exp = 0; | |||||
return x; | |||||
} | |||||
real ret = x; | |||||
int exponent = (ret.m_signexp & 0x7fffffffu) - (1 << 30) + 1; | |||||
*exp = exponent + 1; | |||||
ret.m_signexp -= exponent + 1; | |||||
return ret; | |||||
} | |||||
real ldexp(real const &x, int exp) | |||||
{ | |||||
real ret = x; | |||||
if (ret) | |||||
ret.m_signexp += exp; | |||||
return ret; | |||||
} | |||||
real modf(real const &x, real *iptr) | |||||
{ | |||||
real absx = fabs(x); | |||||
real tmp = floor(absx); | |||||
*iptr = copysign(tmp, x); | |||||
return copysign(absx - tmp, x); | |||||
} | |||||
real copysign(real const &x, real const &y) | real copysign(real const &x, real const &y) | ||||
{ | { | ||||
real ret = x; | real ret = x; | ||||
@@ -1063,6 +1095,32 @@ real atan(real const &x) | |||||
return ret; | return ret; | ||||
} | } | ||||
real atan2(real const &y, real const &x) | |||||
{ | |||||
if (!y) | |||||
{ | |||||
if ((x.m_signexp >> 31) == 0) | |||||
return y; | |||||
if (y.m_signexp >> 31) | |||||
return -real::R_PI; | |||||
return real::R_PI; | |||||
} | |||||
if (!x) | |||||
{ | |||||
if (y.m_signexp >> 31) | |||||
return -real::R_PI; | |||||
return real::R_PI; | |||||
} | |||||
/* FIXME: handle the Inf and NaN cases */ | |||||
real z = y / x; | |||||
real ret = atan(z); | |||||
if (x < real::R_0) | |||||
ret += (y > real::R_0) ? real::R_PI : -real::R_PI; | |||||
return ret; | |||||
} | |||||
void real::hexprint() const | void real::hexprint() const | ||||
{ | { | ||||
printf("%08x", m_signexp); | printf("%08x", m_signexp); | ||||
@@ -69,7 +69,7 @@ public: | |||||
friend real asin(real const &x); | friend real asin(real const &x); | ||||
friend real acos(real const &x); | friend real acos(real const &x); | ||||
friend real atan(real const &x); | friend real atan(real const &x); | ||||
/* FIXME: atan2 */ | |||||
friend real atan2(real const &y, real const &x); | |||||
/* Hyperbolic functions */ | /* Hyperbolic functions */ | ||||
friend real sinh(real const &x); | friend real sinh(real const &x); | ||||
@@ -82,7 +82,9 @@ public: | |||||
friend real log(real const &x); | friend real log(real const &x); | ||||
friend real log2(real const &x); | friend real log2(real const &x); | ||||
friend real log10(real const &x); | friend real log10(real const &x); | ||||
/* FIXME: frexp ldexp modf */ | |||||
friend real frexp(real const &x, int *exp); | |||||
friend real ldexp(real const &x, int exp); | |||||
friend real modf(real const &x, real *iptr); | |||||
/* Power functions */ | /* Power functions */ | ||||
friend real re(real const &x); | friend real re(real const &x); | ||||