aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2026-04-13 19:25:11 +0200
committerlemon <lsof@mailbox.org>2026-04-13 19:30:01 +0200
commitddbd42e66cc71b470730037d76f4f267e98d8d40 (patch)
treeaae9ff541b3e0690e23e391bb2e5e8927d34bf38 /test
parent36143af2748b6fcae02ca320baaac417d77ebe58 (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.c88
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;
+}