From 0769a82f4b807929931c4c879657c91e19946e5c Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Wed, 26 Feb 2025 02:10:06 +0000 Subject: [PATCH] feat(userspace/libc): update math functions Signed-off-by: EnderIce2 --- Userspace/libc/include/math.h | 404 ++++++++++++++++++++-------------- Userspace/libc/src/std/math.c | 300 ++++++++++++------------- 2 files changed, 386 insertions(+), 318 deletions(-) diff --git a/Userspace/libc/include/math.h b/Userspace/libc/include/math.h index a0059231..0fa7dcde 100644 --- a/Userspace/libc/include/math.h +++ b/Userspace/libc/include/math.h @@ -18,13 +18,13 @@ #ifndef _MATH_H #define _MATH_H +#include + #ifdef __cplusplus extern "C" { #endif // __cplusplus -#define FLT_EVAL_METHOD 0 - #if FLT_EVAL_METHOD == 0 typedef float float_t; typedef double double_t; @@ -38,186 +38,254 @@ typedef long double double_t; #error "Unsupported FLT_EVAL_METHOD" #endif +#define fpclassify(x) __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, (x)) +#define isfinite(x) __builtin_isfinite(x) +#define isgreater(x, y) __builtin_isgreater(x, y) +#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y) +#define isinf(x) __builtin_isinf(x) +#define isless(x, y) __builtin_isless(x, y) +#define islessequal(x, y) __builtin_islessequal(x, y) +#define islessgreater(x, y) __builtin_islessgreater(x, y) +#define isnan(x) __builtin_isnan(x) +#define isnormal(x) __builtin_isnormal(x) +#define isunordered(x, y) __builtin_isunordered(x, y) +#define signbit(x) __builtin_signbit(x) + +#define M_E 2.71828182845904523536 +#define M_El 2.71828182845904523536028747135266249775724709369995L +#define M_EGAMMA 0.57721566490153286060 +#define M_EGAMMAl 0.57721566490153286060651209008240243104215933593992L +#define M_LOG2E 1.44269504088896340736 +#define M_LOG2El 1.44269504088896340735992468100189213742664595415299L +#define M_LOG10E 0.43429448190325182765 +#define M_LOG10El 0.43429448190325182765112891891660508229439700580366L +#define M_LN2 0.69314718055994530942 +#define M_LN2l 0.69314718055994530941723212145817656807550013436026L +#define M_LN10 2.30258509299404568402 +#define M_LN10l 2.30258509299404568401799145468436420760110148862877L +#define M_PHI 1.61803398874989484820 +#define M_PHIl 1.61803398874989484820458683436563811772030917980576L +#define M_PI 3.14159265358979323846 +#define M_PIl 3.14159265358979323846264338327950288419716939937510L +#define M_PI_2 1.57079632679489661923 +#define M_PI_2l 1.57079632679489661923132169163975144209858469968755L +#define M_PI_4 0.78539816339744830962 +#define M_PI_4l 0.78539816339744830961566084581987572104929234984378L +#define M_1_PI 0.31830988618379067154 +#define M_1_PIl 0.31830988618379067153776752674502872406891929148091L +#define M_1_SQRTPI 0.56418958354775628695 +#define M_1_SQRTPIl 0.56418958354775628694807945156077258584405062932899L +#define M_2_PI 0.63661977236758134308 +#define M_2_PIl 0.63661977236758134307553505349005744813783858296182L +#define M_2_SQRTPI 1.12837916709551257390 +#define M_2_SQRTPIl 1.12837916709551257389615890312154517168810125865798L +#define M_SQRT2 1.41421356237309504880 +#define M_SQRT2l 1.41421356237309504880168872420969807856967187537694L +#define M_SQRT3 1.73205080756887729352 +#define M_SQRT3l 1.73205080756887729352744634150587236694280525381038L +#define M_SQRT1_2 0.70710678118654752440 +#define M_SQRT1_2l 0.70710678118654752440084436210484903928483593768847L +#define M_SQRT1_3 0.57735026918962576450 +#define M_SQRT1_3l 0.57735026918962576450914878050195745564760175127013L + +#define HUGE_VAL (__builtin_huge_val()) +#define HUGE_VALF (__builtin_huge_valf()) +#define HUGE_VALL (__builtin_huge_vall()) + +#define FP_INFINITE 1 +#define FP_NAN 2 +#define FP_NORMAL 3 +#define FP_SUBNORMAL 4 +#define FP_ZERO 5 + +#define FP_ILOGB0 (-2147483647 - 1) +#define FP_ILOGBNAN 2147483647 + +#define MATH_ERRNO 1 +#define MATH_ERREXCEPT 2 + +#define math_errhandling (MATH_ERRNO | MATH_ERREXCEPT) + extern int signgam; - double acos(double); - float acosf(float); - double acosh(double); - float acoshf(float); - long double acoshl(long double); - long double acosl(long double); - double asin(double); - float asinf(float); - double asinh(double); - float asinhf(float); - long double asinhl(long double); - long double asinl(long double); - double atan(double); - double atan2(double, double); - float atan2f(float, float); - long double atan2l(long double, long double); - float atanf(float); - double atanh(double); - float atanhf(float); - long double atanhl(long double); - long double atanl(long double); - double cbrt(double); - float cbrtf(float); - long double cbrtl(long double); - double ceil(double); - float ceilf(float); - long double ceill(long double); - double copysign(double, double); - float copysignf(float, float); - long double copysignl(long double, long double); + double acos(double x); + float acosf(float x); + double acosh(double x); + float acoshf(float x); + long double acoshl(long double x); + long double acosl(long double x); + double asin(double x); + float asinf(float x); + double asinh(double x); + float asinhf(float x); + long double asinhl(long double x); + long double asinl(long double x); + double atan(double x); + double atan2(double y, double x); + float atan2f(float y, float x); + long double atan2l(long double y, long double x); + float atanf(float x); + double atanh(double x); + float atanhf(float x); + long double atanhl(long double x); + long double atanl(long double x); + double cbrt(double x); + float cbrtf(float x); + long double cbrtl(long double x); + double ceil(double x); + float ceilf(float x); + long double ceill(long double x); + double copysign(double x, double y); + float copysignf(float x, float y); + long double copysignl(long double x, long double y); double cos(double x); float cosf(float x); double cosh(double x); float coshf(float x); long double coshl(long double x); long double cosl(long double x); - double erf(double); - double erfc(double); - float erfcf(float); - long double erfcl(long double); - float erff(float); - long double erfl(long double); - double exp(double); - double exp2(double); - float exp2f(float); - long double exp2l(long double); - float expf(float); - long double expl(long double); - double expm1(double); - float expm1f(float); - long double expm1l(long double); - double fabs(double); - float fabsf(float); - long double fabsl(long double); - double fdim(double, double); - float fdimf(float, float); - long double fdiml(long double, long double); - double floor(double); - float floorf(float); - long double floorl(long double); - double fma(double, double, double); - float fmaf(float, float, float); - long double fmal(long double, long double, long double); - double fmax(double, double); - float fmaxf(float, float); - long double fmaxl(long double, long double); - double fmin(double, double); - float fminf(float, float); - long double fminl(long double, long double); - double fmod(double, double); - float fmodf(float, float); - long double fmodl(long double, long double); - double frexp(double, int *); - float frexpf(float value, int *); - long double frexpl(long double value, int *); - double hypot(double, double); - float hypotf(float, float); - long double hypotl(long double, long double); - int ilogb(double); - int ilogbf(float); - int ilogbl(long double); - double j0(double); - double j1(double); - double jn(int, double); - double ldexp(double, int); - float ldexpf(float, int); - long double ldexpl(long double, int); - double lgamma(double); - float lgammaf(float); - long double lgammal(long double); - long long llrint(double); - long long llrintf(float); - long long llrintl(long double); - long long llround(double); - long long llroundf(float); - long long llroundl(long double); - double log(double); - double log10(double); - float log10f(float); - long double log10l(long double); - double log1p(double); - float log1pf(float); - long double log1pl(long double); - double log2(double); - float log2f(float); - long double log2l(long double); - double logb(double); - float logbf(float); - long double logbl(long double); - float logf(float); - long double logl(long double); - long lrint(double); - long lrintf(float); - long lrintl(long double); - long lround(double); - long lroundf(float); - long lroundl(long double); - double modf(double, double *); - float modff(float, float *); - long double modfl(long double, long double *); - double nan(const char *); - float nanf(const char *); - long double nanl(const char *); - double nearbyint(double); - float nearbyintf(float); - long double nearbyintl(long double); - double nextafter(double, double); - float nextafterf(float, float); - long double nextafterl(long double, long double); - double nexttoward(double, long double); - float nexttowardf(float, long double); - long double nexttowardl(long double, long double); - double pow(double, double); - float powf(float, float); - long double powl(long double, long double); - double remainder(double, double); - float remainderf(float, float); - long double remainderl(long double, long double); - double remquo(double, double, int *); - float remquof(float, float, int *); - long double remquol(long double, long double, int *); - double rint(double); - float rintf(float); - long double rintl(long double); - double round(double); - float roundf(float); - long double roundl(long double); - double scalb(double, double); - double scalbln(double, long); - float scalblnf(float, long); - long double scalblnl(long double, long); - double scalbn(double, int); - float scalbnf(float, int); - long double scalbnl(long double, int); + double erf(double x); + double erfc(double x); + float erfcf(float x); + long double erfcl(long double x); + float erff(float x); + long double erfl(long double x); + double exp(double x); + double exp2(double x); + float exp2f(float x); + long double exp2l(long double x); + float expf(float x); + long double expl(long double x); + double expm1(double x); + float expm1f(float x); + long double expm1l(long double x); + double fabs(double x); + float fabsf(float x); + long double fabsl(long double x); + double fdim(double x, double y); + float fdimf(float x, float y); + long double fdiml(long double x, long double y); + double floor(double x); + float floorf(float x); + long double floorl(long double x); + double fma(double x, double y, double z); + float fmaf(float x, float y, float z); + long double fmal(long double x, long double y, long double z); + double fmax(double x, double y); + float fmaxf(float x, float y); + long double fmaxl(long double x, long double y); + double fmin(double x, double y); + float fminf(float x, float y); + long double fminl(long double x, long double y); + double fmod(double x, double y); + float fmodf(float x, float y); + long double fmodl(long double x, long double y); + double frexp(double num, int *exp); + float frexpf(float num, int *exp); + long double frexpl(long double num, int *exp); + double hypot(double x, double y); + float hypotf(float x, float y); + long double hypotl(long double x, long double y); + int ilogb(double x); + int ilogbf(float x); + int ilogbl(long double x); + double j0(double x); + double j1(double x); + double jn(int n, double x); + double ldexp(double x, int exp); + float ldexpf(float x, int exp); + long double ldexpl(long double x, int exp); + double lgamma(double x); + float lgammaf(float x); + long double lgammal(long double x); + long long llrint(double x); + long long llrintf(float x); + long long llrintl(long double x); + long long llround(double x); + long long llroundf(float x); + long long llroundl(long double x); + double log(double x); + double log10(double x); + float log10f(float x); + long double log10l(long double x); + double log1p(double x); + float log1pf(float x); + long double log1pl(long double x); + double log2(double x); + float log2f(float x); + long double log2l(long double x); + double logb(double x); + float logbf(float x); + long double logbl(long double x); + float logf(float x); + long double logl(long double x); + long lrint(double x); + long lrintf(float x); + long lrintl(long double x); + long lround(double x); + long lroundf(float x); + long lroundl(long double x); + double modf(double x, double *iptr); + float modff(float value, float *iptr); + long double modfl(long double x, long double *iptr); + double nan(const char *tagp); + float nanf(const char *tagp); + long double nanl(const char *tagp); + double nearbyint(double x); + float nearbyintf(float x); + long double nearbyintl(long double x); + double nextafter(double x, double y); + float nextafterf(float x, float y); + long double nextafterl(long double x, long double y); + double nexttoward(double x, long double y); + float nexttowardf(float x, long double y); + long double nexttowardl(long double x, long double y); + double pow(double x, double y); + float powf(float x, float y); + long double powl(long double x, long double y); + double remainder(double x, double y); + float remainderf(float x, float y); + long double remainderl(long double x, long double y); + double remquo(double x, double y, int *quo); + float remquof(float x, float y, int *quo); + long double remquol(long double x, long double y, int *quo); + double rint(double x); + float rintf(float x); + long double rintl(long double x); + double round(double x); + float roundf(float x); + long double roundl(long double x); + double scalb(double x, double y); + double scalbln(double x, long n); + float scalblnf(float x, long n); + long double scalblnl(long double x, long n); + double scalbn(double x, int n); + float scalbnf(float x, int n); + long double scalbnl(long double x, int n); double sin(double x); float sinf(float x); double sinh(double x); float sinhf(float x); long double sinhl(long double x); long double sinl(long double x); - double sqrt(double); - float sqrtf(float); - long double sqrtl(long double); - double tan(double); - float tanf(float); - double tanh(double); - float tanhf(float); - long double tanhl(long double); - long double tanl(long double); - double tgamma(double); - float tgammaf(float); - long double tgammal(long double); - double trunc(double); - float truncf(float); - long double truncl(long double); - double y0(double); - double y1(double); - double yn(int, double); + double sqrt(double x); + float sqrtf(float x); + long double sqrtl(long double x); + double tan(double x); + float tanf(float x); + double tanh(double x); + float tanhf(float x); + long double tanhl(long double x); + long double tanl(long double x); + double tgamma(double x); + float tgammaf(float x); + long double tgammal(long double x); + double trunc(double x); + float truncf(float x); + long double truncl(long double x); + double y0(double x); + double y1(double x); + double yn(int n, double x); #ifdef __cplusplus } diff --git a/Userspace/libc/src/std/math.c b/Userspace/libc/src/std/math.c index e86149be..c11ec62f 100644 --- a/Userspace/libc/src/std/math.c +++ b/Userspace/libc/src/std/math.c @@ -38,165 +38,165 @@ export double atan(double x); export double atan2(double y, double x); export float atan2f(float y, float x); export long double atan2l(long double y, long double x); -export float atanf(float); -export double atanh(double); -export float atanhf(float); -export long double atanhl(long double); -export long double atanl(long double); -export double cbrt(double); -export float cbrtf(float); -export long double cbrtl(long double); -export double ceil(double); -export float ceilf(float); -export long double ceill(long double); -export double copysign(double, double); -export float copysignf(float, float); -export long double copysignl(long double, long double); +export float atanf(float x); +export double atanh(double x); +export float atanhf(float x); +export long double atanhl(long double x); +export long double atanl(long double x); +export double cbrt(double x); +export float cbrtf(float x); +export long double cbrtl(long double x); +export double ceil(double x); +export float ceilf(float x); +export long double ceill(long double x); +export double copysign(double x, double y); +export float copysignf(float x, float y); +export long double copysignl(long double x, long double y); export double cos(double x); export float cosf(float x); export double cosh(double x); export float coshf(float x); export long double coshl(long double x); export long double cosl(long double x); -export double erf(double); -export double erfc(double); -export float erfcf(float); -export long double erfcl(long double); -export float erff(float); -export long double erfl(long double); -export double exp(double); -export double exp2(double); -export float exp2f(float); -export long double exp2l(long double); -export float expf(float); -export long double expl(long double); -export double expm1(double); -export float expm1f(float); -export long double expm1l(long double); -export double fabs(double); -export float fabsf(float); -export long double fabsl(long double); -export double fdim(double, double); -export float fdimf(float, float); -export long double fdiml(long double, long double); -export double floor(double); -export float floorf(float); -export long double floorl(long double); -export double fma(double, double, double); -export float fmaf(float, float, float); -export long double fmal(long double, long double, long double); -export double fmax(double, double); -export float fmaxf(float, float); -export long double fmaxl(long double, long double); -export double fmin(double, double); -export float fminf(float, float); -export long double fminl(long double, long double); -export double fmod(double, double); -export float fmodf(float, float); -export long double fmodl(long double, long double); -export double frexp(double, int *); -export float frexpf(float value, int *); -export long double frexpl(long double value, int *); -export double hypot(double, double); -export float hypotf(float, float); -export long double hypotl(long double, long double); -export int ilogb(double); -export int ilogbf(float); -export int ilogbl(long double); -export double j0(double); -export double j1(double); -export double jn(int, double); -export double ldexp(double, int); -export float ldexpf(float, int); -export long double ldexpl(long double, int); -export double lgamma(double); -export float lgammaf(float); -export long double lgammal(long double); -export long long llrint(double); -export long long llrintf(float); -export long long llrintl(long double); -export long long llround(double); -export long long llroundf(float); -export long long llroundl(long double); -export double log(double); -export double log10(double); -export float log10f(float); -export long double log10l(long double); -export double log1p(double); -export float log1pf(float); -export long double log1pl(long double); -export double log2(double); -export float log2f(float); -export long double log2l(long double); -export double logb(double); -export float logbf(float); -export long double logbl(long double); -export float logf(float); -export long double logl(long double); -export long lrint(double); -export long lrintf(float); -export long lrintl(long double); -export long lround(double); -export long lroundf(float); -export long lroundl(long double); -export double modf(double, double *); -export float modff(float, float *); -export long double modfl(long double, long double *); -export double nan(const char *); -export float nanf(const char *); -export long double nanl(const char *); -export double nearbyint(double); -export float nearbyintf(float); -export long double nearbyintl(long double); -export double nextafter(double, double); -export float nextafterf(float, float); -export long double nextafterl(long double, long double); -export double nexttoward(double, long double); -export float nexttowardf(float, long double); -export long double nexttowardl(long double, long double); -export double pow(double, double); -export float powf(float, float); -export long double powl(long double, long double); -export double remainder(double, double); -export float remainderf(float, float); -export long double remainderl(long double, long double); -export double remquo(double, double, int *); -export float remquof(float, float, int *); -export long double remquol(long double, long double, int *); -export double rint(double); -export float rintf(float); -export long double rintl(long double); -export double round(double); -export float roundf(float); -export long double roundl(long double); -export double scalb(double, double); -export double scalbln(double, long); -export float scalblnf(float, long); -export long double scalblnl(long double, long); -export double scalbn(double, int); -export float scalbnf(float, int); -export long double scalbnl(long double, int); +export double erf(double x); +export double erfc(double x); +export float erfcf(float x); +export long double erfcl(long double x); +export float erff(float x); +export long double erfl(long double x); +export double exp(double x); +export double exp2(double x); +export float exp2f(float x); +export long double exp2l(long double x); +export float expf(float x); +export long double expl(long double x); +export double expm1(double x); +export float expm1f(float x); +export long double expm1l(long double x); +export double fabs(double x); +export float fabsf(float x); +export long double fabsl(long double x); +export double fdim(double x, double y); +export float fdimf(float x, float y); +export long double fdiml(long double x, long double y); +export double floor(double x); +export float floorf(float x); +export long double floorl(long double x); +export double fma(double x, double y, double z); +export float fmaf(float x, float y, float z); +export long double fmal(long double x, long double y, long double z); +export double fmax(double x, double y); +export float fmaxf(float x, float y); +export long double fmaxl(long double x, long double y); +export double fmin(double x, double y); +export float fminf(float x, float y); +export long double fminl(long double x, long double y); +export double fmod(double x, double y); +export float fmodf(float x, float y); +export long double fmodl(long double x, long double y); +export double frexp(double num, int *exp); +export float frexpf(float num, int *exp); +export long double frexpl(long double num, int *exp); +export double hypot(double x, double y); +export float hypotf(float x, float y); +export long double hypotl(long double x, long double y); +export int ilogb(double x); +export int ilogbf(float x); +export int ilogbl(long double x); +export double j0(double x); +export double j1(double x); +export double jn(int n, double x); +export double ldexp(double x, int exp); +export float ldexpf(float x, int exp); +export long double ldexpl(long double x, int exp); +export double lgamma(double x); +export float lgammaf(float x); +export long double lgammal(long double x); +export long long llrint(double x); +export long long llrintf(float x); +export long long llrintl(long double x); +export long long llround(double x); +export long long llroundf(float x); +export long long llroundl(long double x); +export double log(double x); +export double log10(double x); +export float log10f(float x); +export long double log10l(long double x); +export double log1p(double x); +export float log1pf(float x); +export long double log1pl(long double x); +export double log2(double x); +export float log2f(float x); +export long double log2l(long double x); +export double logb(double x); +export float logbf(float x); +export long double logbl(long double x); +export float logf(float x); +export long double logl(long double x); +export long lrint(double x); +export long lrintf(float x); +export long lrintl(long double x); +export long lround(double x); +export long lroundf(float x); +export long lroundl(long double x); +export double modf(double x, double *iptr); +export float modff(float value, float *iptr); +export long double modfl(long double x, long double *iptr); +export double nan(const char *tagp); +export float nanf(const char *tagp); +export long double nanl(const char *tagp); +export double nearbyint(double x); +export float nearbyintf(float x); +export long double nearbyintl(long double x); +export double nextafter(double x, double y); +export float nextafterf(float x, float y); +export long double nextafterl(long double x, long double y); +export double nexttoward(double x, long double y); +export float nexttowardf(float x, long double y); +export long double nexttowardl(long double x, long double y); +export double pow(double x, double y); +export float powf(float x, float y); +export long double powl(long double x, long double y); +export double remainder(double x, double y); +export float remainderf(float x, float y); +export long double remainderl(long double x, long double y); +export double remquo(double x, double y, int *quo); +export float remquof(float x, float y, int *quo); +export long double remquol(long double x, long double y, int *quo); +export double rint(double x); +export float rintf(float x); +export long double rintl(long double x); +export double round(double x); +export float roundf(float x); +export long double roundl(long double x); +export double scalb(double x, double y); +export double scalbln(double x, long n); +export float scalblnf(float x, long n); +export long double scalblnl(long double x, long n); +export double scalbn(double x, int n); +export float scalbnf(float x, int n); +export long double scalbnl(long double x, int n); export double sin(double x); export float sinf(float x); export double sinh(double x); export float sinhf(float x); export long double sinhl(long double x); export long double sinl(long double x); -export double sqrt(double); -export float sqrtf(float); -export long double sqrtl(long double); -export double tan(double); -export float tanf(float); -export double tanh(double); -export float tanhf(float); -export long double tanhl(long double); -export long double tanl(long double); -export double tgamma(double); -export float tgammaf(float); -export long double tgammal(long double); -export double trunc(double); -export float truncf(float); -export long double truncl(long double); -export double y0(double); -export double y1(double); -export double yn(int, double); +export double sqrt(double x); +export float sqrtf(float x); +export long double sqrtl(long double x); +export double tan(double x); +export float tanf(float x); +export double tanh(double x); +export float tanhf(float x); +export long double tanhl(long double x); +export long double tanl(long double x); +export double tgamma(double x); +export float tgammaf(float x); +export long double tgammal(long double x); +export double trunc(double x); +export float truncf(float x); +export long double truncl(long double x); +export double y0(double x); +export double y1(double x); +export double yn(int n, double x);