From 24b5fd4c4c1fc98fe71828bfe2b322663e82e17a Mon Sep 17 00:00:00 2001 From: Valtteri Koskivuori Date: Tue, 25 Feb 2020 21:02:22 +0200 Subject: [PATCH] LibM: Implement floating point variants of various math functions --- Libraries/LibM/math.cpp | 54 +++++++++++++++++++++++++++++++++++++++++ Libraries/LibM/math.h | 1 + 2 files changed, 55 insertions(+) diff --git a/Libraries/LibM/math.cpp b/Libraries/LibM/math.cpp index 054f6148a0..a43a156612 100644 --- a/Libraries/LibM/math.cpp +++ b/Libraries/LibM/math.cpp @@ -69,6 +69,11 @@ double cos(double angle) return sin(angle + M_PI_2); } +float cosf(float angle) +{ + return sinf(angle + M_PI_2); +} + // This can also be done with a taylor expansion, but for // now this works pretty well (and doesn't mess anything up // in quake in particular, which is very Floating-Point precision @@ -84,12 +89,27 @@ double sin(double angle) return ret; } +float sinf(float angle) +{ + float ret = 0.0f; + __asm__( + "fsin" + : "=t"(ret) + : "0"(angle)); + return ret; +} + double pow(double x, double y) { //FIXME: Extremely unlikely to be standards compliant. return exp(y * log(x)); } +float powf(float x, float y) +{ + return (float)exp((double)y * log((double)x)); +} + double ldexp(double x, int exp) { // FIXME: Please fix me. I am naive. @@ -139,6 +159,15 @@ double sqrt(double x) return res; } +float sqrtf(float x) +{ + float res; + __asm__("fsqrt" + : "=t"(res) + : "0"(x)); + return res; +} + double sinh(double x) { double exponentiated = exp(x); @@ -167,6 +196,11 @@ double log(double x) return y + 2 * (x - exponentiated) / (x + exponentiated); } +float logf(float x) +{ + return (float)log(x); +} + double fmod(double index, double period) { return index - trunc(index / period) * period; @@ -208,6 +242,11 @@ double exp(double exponent) return result * taylor_series_result; } +float expf(float exponent) +{ + return (float)exp(exponent); +} + double cosh(double x) { double exponentiated = exp(-x); @@ -232,6 +271,11 @@ double atan2(double y, double x) return atan(y / x) - M_PI; } +float atan2f(float y, float x) +{ + return (float)atan2(y, x); +} + double atan(double x) { if (x < 0) @@ -265,11 +309,21 @@ double asin(double x) return value; } +float asinf(float x) +{ + return (float)asin(x); +} + double acos(double x) { return M_PI_2 - asin(x); } +float acosf(float x) +{ + return M_PI_2 - asinf(x); +} + double fabs(double value) { return value < 0 ? -value : value; diff --git a/Libraries/LibM/math.h b/Libraries/LibM/math.h index e0803be128..f25cbb99ec 100644 --- a/Libraries/LibM/math.h +++ b/Libraries/LibM/math.h @@ -84,6 +84,7 @@ double ldexp(double, int exp); float ldexpf(float, int exp); double pow(double x, double y); +float powf(float x, float y); double log2(double); float log2f(float);