LibM: Add ilogb and logb

This commit is contained in:
Mițca Dumitru 2021-03-07 20:40:01 +02:00 committed by Andreas Kling
parent 190952675e
commit 352b383280
Notes: sideshowbarker 2024-07-18 21:36:02 +09:00
2 changed files with 60 additions and 0 deletions

View File

@ -243,6 +243,26 @@ static FloatType internal_nextafter(FloatType x, bool up)
return extractor.d;
}
template<typename FloatT>
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<FloatT>;
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;

View File

@ -26,6 +26,7 @@
#pragma once
#include <limits.h>
#include <sys/cdefs.h>
#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;