Commit e5d667de authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcrt: Import cbrt implementation from musl.

parent 09bcc133
...@@ -19622,7 +19622,6 @@ for ac_func in \ ...@@ -19622,7 +19622,6 @@ for ac_func in \
asinhf \ asinhf \
atanh \ atanh \
atanhf \ atanhf \
cbrt \
erf \ erf \
erfc \ erfc \
erfcf \ erfcf \
......
...@@ -2662,7 +2662,6 @@ AC_CHECK_FUNCS(\ ...@@ -2662,7 +2662,6 @@ AC_CHECK_FUNCS(\
asinhf \ asinhf \
atanh \ atanh \
atanhf \ atanhf \
cbrt \
erf \ erf \
erfc \ erfc \
erfcf \ erfcf \
......
...@@ -4497,10 +4497,50 @@ short CDECL _dclass(double x) ...@@ -4497,10 +4497,50 @@ short CDECL _dclass(double x)
/********************************************************************* /*********************************************************************
* cbrt (MSVCR120.@) * cbrt (MSVCR120.@)
*
* Copied from musl: src/math/cbrt.c
*/ */
double CDECL cbrt(double x) double CDECL cbrt(double x)
{ {
return unix_funcs->cbrt( x ); static const UINT32 B1 = 715094163, B2 = 696219795;
static const double P0 = 1.87595182427177009643,
P1 = -1.88497979543377169875,
P2 = 1.621429720105354466140,
P3 = -0.758397934778766047437,
P4 = 0.145996192886612446982;
union {double f; UINT64 i;} u = {x};
double r,s,t,w;
UINT32 hx = u.i >> 32 & 0x7fffffff;
if (hx >= 0x7ff00000) /* cbrt(NaN,INF) is itself */
return x + x;
if (hx < 0x00100000) { /* zero or subnormal? */
u.f = x * 0x1p54;
hx = u.i>>32 & 0x7fffffff;
if (hx == 0)
return x;
hx = hx / 3 + B2;
} else
hx = hx / 3 + B1;
u.i &= 1ULL << 63;
u.i |= (UINT64)hx << 32;
t = u.f;
r = (t * t) * (t / x);
t = t * ((P0 + r * (P1 + r * P2)) + ((r * r) * r) * (P3 + r * P4));
u.f = t;
u.i = (u.i + 0x80000000) & 0xffffffffc0000000ULL;
t = u.f;
s = t * t;
r = x / s;
w = t + t;
r = (r - t) / (w + r);
t = t + t * r;
return t;
} }
/********************************************************************* /*********************************************************************
......
...@@ -122,18 +122,6 @@ static float CDECL unix_atanhf(float x) ...@@ -122,18 +122,6 @@ static float CDECL unix_atanhf(float x)
} }
/********************************************************************* /*********************************************************************
* cbrt
*/
static double CDECL unix_cbrt(double x)
{
#ifdef HAVE_CBRT
return cbrt(x);
#else
return x < 0 ? -pow(-x, 1.0 / 3.0) : pow(x, 1.0 / 3.0);
#endif
}
/*********************************************************************
* ceil * ceil
*/ */
static double CDECL unix_ceil( double x ) static double CDECL unix_ceil( double x )
...@@ -725,7 +713,6 @@ static const struct unix_funcs funcs = ...@@ -725,7 +713,6 @@ static const struct unix_funcs funcs =
unix_asinhf, unix_asinhf,
unix_atanh, unix_atanh,
unix_atanhf, unix_atanhf,
unix_cbrt,
unix_ceil, unix_ceil,
unix_ceilf, unix_ceilf,
unix_cos, unix_cos,
......
...@@ -29,7 +29,6 @@ struct unix_funcs ...@@ -29,7 +29,6 @@ struct unix_funcs
float (CDECL *asinhf)(float x); float (CDECL *asinhf)(float x);
double (CDECL *atanh)(double x); double (CDECL *atanh)(double x);
float (CDECL *atanhf)(float x); float (CDECL *atanhf)(float x);
double (CDECL *cbrt)(double x);
double (CDECL *ceil)(double x); double (CDECL *ceil)(double x);
float (CDECL *ceilf)(float x); float (CDECL *ceilf)(float x);
double (CDECL *cos)(double x); double (CDECL *cos)(double x);
......
...@@ -67,9 +67,6 @@ ...@@ -67,9 +67,6 @@
/* Define to 1 if you have the <Carbon/Carbon.h> header file. */ /* Define to 1 if you have the <Carbon/Carbon.h> header file. */
#undef HAVE_CARBON_CARBON_H #undef HAVE_CARBON_CARBON_H
/* Define to 1 if you have the `cbrt' function. */
#undef HAVE_CBRT
/* Define to 1 if you have the `clock_gettime' function. */ /* Define to 1 if you have the `clock_gettime' function. */
#undef HAVE_CLOCK_GETTIME #undef HAVE_CLOCK_GETTIME
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment