From: Alexandre Julliard julliard@winehq.org
With the changes from 9c8f8e715f4fd3a35924e4e9d32eb42fa8b56a18. --- dlls/msvcrt/math.c | 47 -------------------------------------- libs/musl/src/math/acosf.c | 21 +++++++++-------- 2 files changed, 11 insertions(+), 57 deletions(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index ca95f51873a..b8a3fae663f 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -305,53 +305,6 @@ static float asinf_R(float z) return p / q; }
-/********************************************************************* - * acosf (MSVCRT.@) - * - * Copied from musl: src/math/acosf.c - */ -float CDECL acosf( float x ) -{ - static const double pio2_lo = 6.12323399573676603587e-17; - static const double pio2_hi = 1.57079632679489655800e+00; - - float z, w, s, c, df; - unsigned int hx, ix; - - hx = *(unsigned int*)&x; - ix = hx & 0x7fffffff; - /* |x| >= 1 or nan */ - if (ix >= 0x3f800000) { - if (ix == 0x3f800000) { - if (hx >> 31) - return M_PI; - return 0; - } - if (isnan(x)) return x; - return math_error(_DOMAIN, "acosf", x, 0, 0 / (x - x)); - } - /* |x| < 0.5 */ - if (ix < 0x3f000000) { - if (ix <= 0x32800000) /* |x| < 2**-26 */ - return M_PI_2; - return pio2_hi - (x - (pio2_lo - x * asinf_R(x * x))); - } - /* x < -0.5 */ - if (hx >> 31) { - z = (1 + x) * 0.5f; - s = sqrtf(z); - return 2*(pio2_hi - (s + (asinf_R(z) * s - pio2_lo))); - } - /* x > 0.5 */ - z = (1 - x) * 0.5f; - s = sqrtf(z); - hx = *(unsigned int*)&s & 0xffff0000; - df = *(float*)&hx; - c = (z - df * df) / (s + df); - w = asinf_R(z) * s + c; - return 2 * (df + w); -} - /********************************************************************* * asinf (MSVCRT.@) * diff --git a/libs/musl/src/math/acosf.c b/libs/musl/src/math/acosf.c index 0da275bf459..bf37332ab52 100644 --- a/libs/musl/src/math/acosf.c +++ b/libs/musl/src/math/acosf.c @@ -18,15 +18,16 @@ static const float pio2_hi = 1.5707962513e+00, /* 0x3fc90fda */ pio2_lo = 7.5497894159e-08, /* 0x33a22168 */ -pS0 = 1.6666586697e-01, -pS1 = -4.2743422091e-02, -pS2 = -8.6563630030e-03, -qS1 = -7.0662963390e-01; +pS0 = 1.66666672e-01, +pS1 = -5.11644611e-02, +pS2 = -1.21124933e-02, +pS3 = -3.58742251e-03, +qS1 = -7.56982703e-01;
static float R(float z) { float_t p, q; - p = z*(pS0+z*(pS1+z*pS2)); + p = z*(pS0+z*(pS1+z*(pS2+z*pS3))); q = 1.0f+z*qS1; return p/q; } @@ -42,23 +43,23 @@ float __cdecl acosf(float x) if (ix >= 0x3f800000) { if (ix == 0x3f800000) { if (hx >> 31) - return 2*pio2_hi + 0x1p-120f; + return M_PI; return 0; } - return 0/(x-x); + if (isnan(x)) return x; + return math_error(_DOMAIN, "acosf", x, 0, 0 / (x - x)); } /* |x| < 0.5 */ if (ix < 0x3f000000) { if (ix <= 0x32800000) /* |x| < 2**-26 */ - return pio2_hi + 0x1p-120f; + return M_PI_2; return pio2_hi - (x - (pio2_lo-x*R(x*x))); } /* x < -0.5 */ if (hx >> 31) { z = (1+x)*0.5f; s = sqrtf(z); - w = R(z)*s-pio2_lo; - return 2*(pio2_hi - (s+w)); + return 2*(pio2_hi - (s + (R(z)*s-pio2_lo))); } /* x > 0.5 */ z = (1-x)*0.5f;