Commit 78fc19d6 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcrt: Import _logbf implementation from musl.

parent 6758acbb
......@@ -275,15 +275,38 @@ float CDECL _nextafterf( float x, float y )
return y;
}
/* Copied from musl: src/math/ilogbf.c */
static int __ilogbf(float x)
{
union { float f; UINT32 i; } u = { x };
int e = u.i >> 23 & 0xff;
if (!e)
{
u.i <<= 9;
if (u.i == 0) return FP_ILOGB0;
/* subnormal x */
for (e = -0x7f; u.i >> 31 == 0; e--, u.i <<= 1);
return e;
}
if (e == 0xff) return u.i << 9 ? FP_ILOGBNAN : INT_MAX;
return e - 0x7f;
}
/*********************************************************************
* _logbf (MSVCRT.@)
*
* Copied from musl: src/math/logbf.c
*/
float CDECL _logbf( float num )
float CDECL _logbf(float x)
{
float ret = unix_funcs->logbf(num);
if (isnan(num)) return math_error(_DOMAIN, "_logbf", num, 0, ret);
if (!num) return math_error(_SING, "_logbf", num, 0, ret);
return ret;
if (!isfinite(x))
return x * x;
if (x == 0) {
*_errno() = ERANGE;
return -1 / (x * x);
}
return __ilogbf(x);
}
#endif
......@@ -6178,23 +6201,9 @@ int CDECL ilogb(double x)
/*********************************************************************
* ilogbf (MSVCR120.@)
*
* Copied from musl: src/math/ilogbf.c
*/
int CDECL ilogbf(float x)
{
union { float f; UINT32 i; } u = { x };
int e = u.i >> 23 & 0xff;
if (!e)
{
u.i <<= 9;
if (u.i == 0) return FP_ILOGB0;
/* subnormal x */
for (e = -0x7f; u.i >> 31 == 0; e--, u.i <<= 1);
return e;
}
if (e == 0xff) return u.i << 9 ? FP_ILOGBNAN : INT_MAX;
return e - 0x7f;
return __ilogbf(x);
}
#endif /* _MSVCR_VER>=120 */
......@@ -388,14 +388,6 @@ static float CDECL unix_log2f(float x)
}
/*********************************************************************
* logbf
*/
static float CDECL unix_logbf( float x )
{
return logbf( x );
}
/*********************************************************************
* pow
*/
static double CDECL unix_pow( double x, double y )
......@@ -536,7 +528,6 @@ static const struct unix_funcs funcs =
unix_log1pf,
unix_log2,
unix_log2f,
unix_logbf,
unix_pow,
unix_powf,
unix_sin,
......
......@@ -56,7 +56,6 @@ struct unix_funcs
float (CDECL *log1pf)(float x);
double (CDECL *log2)(double x);
float (CDECL *log2f)(float x);
float (CDECL *logbf)(float x);
double (CDECL *pow)(double x, double y);
float (CDECL *powf)(float x, float y);
double (CDECL *sin)(double x);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment