diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index a4dd61f881c..5502e2934e9 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -798,10 +798,31 @@ float CDECL tanhf( float x ) /********************************************************************* * ceilf (MSVCRT.@) + * + * Copied from musl: src/math/ceilf.c */ float CDECL ceilf( float x ) { - return unix_funcs->ceilf(x); + union {float f; UINT32 i;} u = {x}; + int e = (int)(u.i >> 23 & 0xff) - 0x7f; + UINT32 m; + + if (e >= 23) + return x; + if (e >= 0) { + m = 0x007fffff >> e; + if ((u.i & m) == 0) + return x; + if (u.i >> 31 == 0) + u.i += m; + u.i &= ~m; + } else { + if (u.i >> 31) + return -0.0; + else if (u.i << 1) + return 1.0; + } + return u.f; } /********************************************************************* diff --git a/dlls/msvcrt/unixlib.c b/dlls/msvcrt/unixlib.c index 9d9f86b7358..634ab6f1a4b 100644 --- a/dlls/msvcrt/unixlib.c +++ b/dlls/msvcrt/unixlib.c @@ -121,14 +121,6 @@ static float CDECL unix_atanhf(float x) #endif } -/********************************************************************* - * ceilf - */ -static float CDECL unix_ceilf( float x ) -{ - return ceilf( x ); -} - /********************************************************************* * cos */ @@ -705,7 +697,6 @@ static const struct unix_funcs funcs = unix_asinhf, unix_atanh, unix_atanhf, - unix_ceilf, unix_cos, unix_cosf, unix_cosh, diff --git a/dlls/msvcrt/unixlib.h b/dlls/msvcrt/unixlib.h index 70d955d5e4f..472eb323850 100644 --- a/dlls/msvcrt/unixlib.h +++ b/dlls/msvcrt/unixlib.h @@ -29,7 +29,6 @@ struct unix_funcs float (CDECL *asinhf)(float x); double (CDECL *atanh)(double x); float (CDECL *atanhf)(float x); - float (CDECL *ceilf)(float x); double (CDECL *cos)(double x); float (CDECL *cosf)(float x); double (CDECL *cosh)(double x);