From a8aeabf39615cebabefaa0bd3eec5be1b647134e Mon Sep 17 00:00:00 2001 From: zerico <71151164+ZERICO2005@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:38:11 -0700 Subject: [PATCH] added _Complex floating point routines --- src/crt/dcomplex.c | 36 ++++++++++++++++++++++++++++++++++++ src/crt/fcomplex.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/crt/dcomplex.c create mode 100644 src/crt/fcomplex.c diff --git a/src/crt/dcomplex.c b/src/crt/dcomplex.c new file mode 100644 index 000000000..c9d281891 --- /dev/null +++ b/src/crt/dcomplex.c @@ -0,0 +1,36 @@ + +// (a + ib) + (c + id) +_Complex long double __adddc3(long double a, long double b, long double c, long double d) { + return (a + c) + (b + d) * 1.0iL; +} + +// (a + ib) - (c + id) +_Complex long double __subdc3(long double a, long double b, long double c, long double d) { + return (a - c) + (b - d) * 1.0iL; +} + +// (a + ib) * (c + id) +_Complex long double __muldc3(long double a, long double b, long double c, long double d) { + return (a * c - b * d) + (a * d + b * c) * 1.0iL; +} + +// (a + ib) / (c + id) +// Uses stable algorithm to avoid overflow/underflow issues +_Complex long double __divdc3(long double a, long double b, long double c, long double d) { + long double r, den; + long double real, imag; + + if (__builtin_fabsl(c) >= __builtin_fabsl(d)) { + r = d / c; + den = c + d * r; + real = (a + b * r) / den; + imag = (b - a * r) / den; + } else { + r = c / d; + den = d + c * r; + real = (a * r + b) / den; + imag = (b * r - a) / den; + } + + return real + imag * 1.0iL; +} diff --git a/src/crt/fcomplex.c b/src/crt/fcomplex.c new file mode 100644 index 000000000..774c81cd6 --- /dev/null +++ b/src/crt/fcomplex.c @@ -0,0 +1,36 @@ + +// (a + ib) + (c + id) +_Complex float __addsc3(float a, float b, float c, float d) { + return (a + c) + (b + d) * 1.0iF; +} + +// (a + ib) - (c + id) +_Complex float __subsc3(float a, float b, float c, float d) { + return (a - c) + (b - d) * 1.0iF; +} + +// (a + ib) * (c + id) +_Complex float __mulsc3(float a, float b, float c, float d) { + return (a * c - b * d) + (a * d + b * c) * 1.0iF; +} + +// (a + ib) / (c + id) +// Uses stable algorithm to avoid overflow/underflow issues +_Complex float __divsc3(float a, float b, float c, float d) { + float r, den; + float real, imag; + + if (__builtin_fabsf(c) >= __builtin_fabsf(d)) { + r = d / c; + den = c + d * r; + real = (a + b * r) / den; + imag = (b - a * r) / den; + } else { + r = c / d; + den = d + c * r; + real = (a * r + b) / den; + imag = (b * r - a) / den; + } + + return real + imag * 1.0iF; +}