mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 06:21:15 +00:00
msvcrt: Use the cbrt()/cbrtf() implementation from the bundled musl library.
This commit is contained in:
parent
e5808e2036
commit
406c583c3b
|
@ -7722,90 +7722,6 @@ void __cdecl __libm_sse2_sqrt_precise(void)
|
|||
|
||||
#if _MSVCR_VER>=120
|
||||
|
||||
/*********************************************************************
|
||||
* cbrt (MSVCR120.@)
|
||||
*
|
||||
* Copied from musl: src/math/cbrt.c
|
||||
*/
|
||||
double CDECL cbrt(double 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;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* cbrtf (MSVCR120.@)
|
||||
*
|
||||
* Copied from musl: src/math/cbrtf.c
|
||||
*/
|
||||
float CDECL cbrtf(float x)
|
||||
{
|
||||
static const unsigned B1 = 709958130, B2 = 642849266;
|
||||
|
||||
double r,T;
|
||||
union {float f; UINT32 i;} u = {x};
|
||||
UINT32 hx = u.i & 0x7fffffff;
|
||||
|
||||
if (hx >= 0x7f800000)
|
||||
return x + x;
|
||||
|
||||
if (hx < 0x00800000) { /* zero or subnormal? */
|
||||
if (hx == 0)
|
||||
return x;
|
||||
u.f = x * 0x1p24f;
|
||||
hx = u.i & 0x7fffffff;
|
||||
hx = hx / 3 + B2;
|
||||
} else
|
||||
hx = hx / 3 + B1;
|
||||
u.i &= 0x80000000;
|
||||
u.i |= hx;
|
||||
|
||||
T = u.f;
|
||||
r = T * T * T;
|
||||
T = T * (x + x + r) / (x + r + r);
|
||||
|
||||
r = T * T * T;
|
||||
T = T * (x + x + r) / (x + r + r);
|
||||
return T;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* exp2 (MSVCR120.@)
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue