diff options
| author | 2026-04-13 19:25:11 +0200 | |
|---|---|---|
| committer | 2026-04-13 19:30:01 +0200 | |
| commit | ddbd42e66cc71b470730037d76f4f267e98d8d40 (patch) | |
| tree | aae9ff541b3e0690e23e391bb2e5e8927d34bf38 /test | |
| parent | 36143af2748b6fcae02ca320baaac417d77ebe58 (diff) | |
C99 complex types MVP
Missing: static eval of complex values,
Silly inefficient implementation of equality comparisons between them
The whole thing is pretty inefficient without proper aggregate mem2reg
anyway
Diffstat (limited to 'test')
| -rw-r--r-- | test/21-complex.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/test/21-complex.c b/test/21-complex.c new file mode 100644 index 0000000..31055f4 --- /dev/null +++ b/test/21-complex.c @@ -0,0 +1,88 @@ +/* CFLAGS: -lm */ +/* EXPECT: +a + b = 4.0+6.0i +a - b = 2.0+2.0i +a * b = -5.0+10.0i +a / b = 2.2-0.4i +c = -2.2-3.0i +|a| = 5.0 +arg(a) = 0.9 +conj(a) = 3.0-4.0i +I = 0.0+1.0i +(1+2i)*I = -2.0+1.0i +(1+2i)/I = 2.0-1.0i +polar(1,0) = 1.0+0.0i +foo(a) = 81.0-95.0 +a==b = 0; b!=a = 1; !a = 0; a&&b = 1; !!I = 1 +e^(i*0.5) = 0.877583+0.479426i +cos(0.5)+i*sin(0.5) = 0.877583+0.479426i +*/ + +#include <complex.h> +#include <stdio.h> +#include <math.h> + + +complex double add_cd(complex double a, complex double b) { return a + b; } +complex double sub_cd(complex double a, complex double b) { return a - b; } +complex double mul_cd(complex double a, complex double b) { return a * b; } +complex double scale(complex double z, double s) { return z * s; } +complex double div_cd(complex double a, complex double b) { return a / b; } +complex double sdiv(complex double z, double s) { return z / s; } +complex double mul_i(complex double z) { return z * I; } +complex double div_i(complex double z) { return z / I; } + +complex double polar_cd(double r, double theta) { + return r * (cos(theta) + I * sin(theta)); +} + +struct s { + complex float t; +}; + +complex float foo(struct s s) { + s.t += 77.0 - 99.0iF; + ++s.t; + return s.t; +} + +int main() { + complex double a = 3.0 + 4.0 * I; + complex double b = 1 + 2.0 * I; + complex double unit = I; + + complex double sum = add_cd(a, b); + printf("a + b = %.1f%+.1fi\n", creal(sum), cimag(sum)); + complex double diff = sub_cd(a, b); + printf("a - b = %.1f%+.1fi\n", creal(diff), cimag(diff)); + complex double prod = mul_cd(a, b); + printf("a * b = %.1f%+.1fi\n", creal(prod), cimag(prod)); + complex double quot = div_cd(a, b); + printf("a / b = %.1f%+.1fi\n", creal(quot), cimag(quot)); + complex double c = sdiv(scale(a, 1.5), -2.0); + printf("c = %.1f%+.1fi\n", creal(c), cimag(c)); + double mag = cabs(a); + printf("|a| = %.1f\n", mag); + double ph = carg(a); + printf("arg(a) = %.1f\n", ph); + complex double conj_a = conj(a); + printf("conj(a) = %.1f%+.1fi\n", creal(conj_a), cimag(conj_a)); + printf("I = %.1f%+.1fi\n", creal(unit), cimag(unit)); + complex double mult_i = mul_i(1.0 + 2.0 * I); + printf("(1+2i)*I = %.1f%+.1fi\n", creal(mult_i), cimag(mult_i)); + complex double divd_i = div_i(1.0 + 2.0 * I); + printf("(1+2i)/I = %.1f%+.1fi\n", creal(divd_i), cimag(divd_i)); + complex double pol = polar_cd(1.0, 0.0); + printf("polar(1,0) = %.1f%+.1fi\n", creal(pol), cimag(pol)); + complex float f = foo((struct s){a}); + printf("foo(a) = %.1f%+.1f\n", crealf(f), cimagf(f)); + printf("a==b = %d; b!=a = %d; !a = %d; a&&b = %d; !!I = %d\n", a == b, b != a, !a, a && b, !!unit); + + double theta = 0.5; + complex double eith = cexp(I * theta); + complex double target = cos(theta) + I * sin(theta); + printf("e^(i*0.5) = %.6f%+.6fi\n", creal(eith), cimag(eith)); + printf("cos(0.5)+i*sin(0.5) = %.6f%+.6fi\n", creal(target), cimag(target)); + + return a; +} |