Skip to content

Commit a8aeabf

Browse files
committed
added _Complex floating point routines
1 parent 5010e3f commit a8aeabf

2 files changed

Lines changed: 72 additions & 0 deletions

File tree

src/crt/dcomplex.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
// (a + ib) + (c + id)
3+
_Complex long double __adddc3(long double a, long double b, long double c, long double d) {
4+
return (a + c) + (b + d) * 1.0iL;
5+
}
6+
7+
// (a + ib) - (c + id)
8+
_Complex long double __subdc3(long double a, long double b, long double c, long double d) {
9+
return (a - c) + (b - d) * 1.0iL;
10+
}
11+
12+
// (a + ib) * (c + id)
13+
_Complex long double __muldc3(long double a, long double b, long double c, long double d) {
14+
return (a * c - b * d) + (a * d + b * c) * 1.0iL;
15+
}
16+
17+
// (a + ib) / (c + id)
18+
// Uses stable algorithm to avoid overflow/underflow issues
19+
_Complex long double __divdc3(long double a, long double b, long double c, long double d) {
20+
long double r, den;
21+
long double real, imag;
22+
23+
if (__builtin_fabsl(c) >= __builtin_fabsl(d)) {
24+
r = d / c;
25+
den = c + d * r;
26+
real = (a + b * r) / den;
27+
imag = (b - a * r) / den;
28+
} else {
29+
r = c / d;
30+
den = d + c * r;
31+
real = (a * r + b) / den;
32+
imag = (b * r - a) / den;
33+
}
34+
35+
return real + imag * 1.0iL;
36+
}

src/crt/fcomplex.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
// (a + ib) + (c + id)
3+
_Complex float __addsc3(float a, float b, float c, float d) {
4+
return (a + c) + (b + d) * 1.0iF;
5+
}
6+
7+
// (a + ib) - (c + id)
8+
_Complex float __subsc3(float a, float b, float c, float d) {
9+
return (a - c) + (b - d) * 1.0iF;
10+
}
11+
12+
// (a + ib) * (c + id)
13+
_Complex float __mulsc3(float a, float b, float c, float d) {
14+
return (a * c - b * d) + (a * d + b * c) * 1.0iF;
15+
}
16+
17+
// (a + ib) / (c + id)
18+
// Uses stable algorithm to avoid overflow/underflow issues
19+
_Complex float __divsc3(float a, float b, float c, float d) {
20+
float r, den;
21+
float real, imag;
22+
23+
if (__builtin_fabsf(c) >= __builtin_fabsf(d)) {
24+
r = d / c;
25+
den = c + d * r;
26+
real = (a + b * r) / den;
27+
imag = (b - a * r) / den;
28+
} else {
29+
r = c / d;
30+
den = d + c * r;
31+
real = (a * r + b) / den;
32+
imag = (b * r - a) / den;
33+
}
34+
35+
return real + imag * 1.0iF;
36+
}

0 commit comments

Comments
 (0)