diff --git a/Userland/Libraries/LibM/math.cpp b/Userland/Libraries/LibM/math.cpp index 8a7a0f15c3..f0d8724f26 100644 --- a/Userland/Libraries/LibM/math.cpp +++ b/Userland/Libraries/LibM/math.cpp @@ -243,6 +243,26 @@ static FloatType internal_nextafter(FloatType x, bool up) return extractor.d; } +template +static int internal_ilogb(FloatT x) NOEXCEPT +{ + if (x == 0) + return FP_ILOGB0; + + if (isnan(x)) + return FP_ILOGNAN; + + if (!isfinite(x)) + return INT_MAX; + + using Extractor = FloatExtractor; + + Extractor extractor; + extractor.d = x; + + return (int)extractor.exponent - Extractor::exponent_bias; +} + extern "C" { double trunc(double x) NOEXCEPT @@ -547,6 +567,36 @@ double fabs(double value) NOEXCEPT return value < 0 ? -value : value; } +int ilogbl(long double x) NOEXCEPT +{ + return internal_ilogb(x); +} + +int ilogb(double x) NOEXCEPT +{ + return internal_ilogb(x); +} + +int ilogbf(float x) NOEXCEPT +{ + return internal_ilogb(x); +} + +long double logbl(long double x) NOEXCEPT +{ + return ilogbl(x); +} + +double logb(double x) NOEXCEPT +{ + return ilogb(x); +} + +float logbf(float x) NOEXCEPT +{ + return ilogbf(x); +} + double log2(double x) NOEXCEPT { double ret = 0.0; diff --git a/Userland/Libraries/LibM/math.h b/Userland/Libraries/LibM/math.h index 8437f29be5..5b68470376 100644 --- a/Userland/Libraries/LibM/math.h +++ b/Userland/Libraries/LibM/math.h @@ -26,6 +26,7 @@ #pragma once +#include #include #if __cplusplus >= 201103L @@ -128,6 +129,15 @@ float ldexpf(float, int exp) NOEXCEPT; double pow(double x, double y) NOEXCEPT; float powf(float x, float y) NOEXCEPT; +#define FP_ILOGB0 INT_MIN +#define FP_ILOGNAN INT_MAX + +int ilogbl(long double) NOEXCEPT; +int ilogb(double) NOEXCEPT; +int ilogbf(float) NOEXCEPT; +long double logbl(long double) NOEXCEPT; +double logb(double) NOEXCEPT; +float logbf(float) NOEXCEPT; double log2(double) NOEXCEPT; float log2f(float) NOEXCEPT; long double log2l(long double) NOEXCEPT;