62 lines
1.3 KiB
C
62 lines
1.3 KiB
C
typedef struct{
|
|
double real;
|
|
double imag;
|
|
} Complex;
|
|
|
|
Complex add(Complex a, Complex b){
|
|
Complex ans;
|
|
ans.real = a.real + b.real;
|
|
ans.imag = a.imag + b.imag;
|
|
return ans;
|
|
}
|
|
|
|
Complex mult(Complex a, Complex b){
|
|
Complex ans;
|
|
ans.real = a.real * b.real - a.imag * b.imag;
|
|
ans.imag = a.real * b.imag + a.imag * b.real;
|
|
return ans;
|
|
}
|
|
|
|
/* it's arguable that things could be better handled if either
|
|
a.real or a.imag is +/-inf, but that's much work */
|
|
Complex inv(Complex a){
|
|
Complex ans;
|
|
double denom = a.real * a.real + a.imag * a.imag;
|
|
ans.real = a.real / denom;
|
|
ans.imag = -a.imag / denom;
|
|
return ans;
|
|
}
|
|
|
|
Complex neg(Complex a){
|
|
Complex ans;
|
|
ans.real = -a.real;
|
|
ans.imag = -a.imag;
|
|
return ans;
|
|
}
|
|
|
|
Complex conj(Complex a){
|
|
Complex ans;
|
|
ans.real = a.real;
|
|
ans.imag = -a.imag;
|
|
return ans;
|
|
}
|
|
|
|
void put(Complex c)
|
|
{
|
|
printf("%lf%+lfI", c.real, c.imag);
|
|
}
|
|
|
|
void complex_ops(void)
|
|
{
|
|
Complex a = { 1.0, 1.0 };
|
|
Complex b = { 3.14159, 1.2 };
|
|
|
|
printf("\na="); put(a);
|
|
printf("\nb="); put(b);
|
|
printf("\na+b="); put(add(a,b));
|
|
printf("\na*b="); put(mult(a,b));
|
|
printf("\n1/a="); put(inv(a));
|
|
printf("\n-a="); put(neg(a));
|
|
printf("\nconj a="); put(conj(a)); printf("\n");
|
|
}
|