msvcrt: Import cbrt implementation from musl.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Piotr Caban 2021-05-17 15:37:55 +02:00 committed by Alexandre Julliard
parent 09bcc133f0
commit e5d667de2f
6 changed files with 41 additions and 20 deletions

1
configure vendored
View File

@ -19622,7 +19622,6 @@ for ac_func in \
asinhf \
atanh \
atanhf \
cbrt \
erf \
erfc \
erfcf \

View File

@ -2662,7 +2662,6 @@ AC_CHECK_FUNCS(\
asinhf \
atanh \
atanhf \
cbrt \
erf \
erfc \
erfcf \

View File

@ -4497,10 +4497,50 @@ short CDECL _dclass(double x)
/*********************************************************************
* cbrt (MSVCR120.@)
*
* Copied from musl: src/math/cbrt.c
*/
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;
}
/*********************************************************************

View File

@ -121,18 +121,6 @@ static float CDECL unix_atanhf(float x)
#endif
}
/*********************************************************************
* 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
*/
@ -725,7 +713,6 @@ static const struct unix_funcs funcs =
unix_asinhf,
unix_atanh,
unix_atanhf,
unix_cbrt,
unix_ceil,
unix_ceilf,
unix_cos,

View File

@ -29,7 +29,6 @@ struct unix_funcs
float (CDECL *asinhf)(float x);
double (CDECL *atanh)(double x);
float (CDECL *atanhf)(float x);
double (CDECL *cbrt)(double x);
double (CDECL *ceil)(double x);
float (CDECL *ceilf)(float x);
double (CDECL *cos)(double x);

View File

@ -67,9 +67,6 @@
/* Define to 1 if you have the <Carbon/Carbon.h> header file. */
#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. */
#undef HAVE_CLOCK_GETTIME