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:
parent
09bcc133f0
commit
e5d667de2f
|
@ -19622,7 +19622,6 @@ for ac_func in \
|
|||
asinhf \
|
||||
atanh \
|
||||
atanhf \
|
||||
cbrt \
|
||||
erf \
|
||||
erfc \
|
||||
erfcf \
|
||||
|
|
|
@ -2662,7 +2662,6 @@ AC_CHECK_FUNCS(\
|
|||
asinhf \
|
||||
atanh \
|
||||
atanhf \
|
||||
cbrt \
|
||||
erf \
|
||||
erfc \
|
||||
erfcf \
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue