Listing 2: Test program
// Test program for math-complex.h. This file can be // compiled by either C99 or C++. #include <stdio.h> #include "math-complex.h" static const long double pi = 3.141592653589793238462643383279502884197L; int main() { // The three complex types store two components of the // underlying floating point type. printf("sizeof(float)=%2d sizeof(float_complex)=%2d\n", (int) sizeof(float), (int) sizeof(float_complex)); printf("sizeof(double)=%2d sizeof(double_complex)=%2d\n", (int) sizeof(double), (int) sizeof(double_complex)); printf("sizeof(long double)=%2d sizeof(long_double_complex)=%2d\n", (int) sizeof(long double), (int) sizeof(long_double_complex)); double_complex x, y, z; x = double_complex(1,2); y = double_complex(2,2); // You may mix complex and the corresponding real type z = x + y + 10.0; printf("(1+2i)+(2+2i)+10 = %g+%gi\n", real(z), imag(z)); // But different complex types must be cast to a // common type or C++ rejects the program. long_double_complex w = long_double_complex(2,3); x = (double_complex) w * double_complex(5, 6); printf("(2+3i) * (5+6i) = %g+%gi\n", real(x), imag(x)); x /= double_complex(5, 6); printf("(-8+27i) / (5+6i) = %g+%gi\n", real(x), imag(x)); // e raised to the imaginary pi power is -1 w = exp(long_double_complex(0., pi)); printf("exp(pi*i) = %Lf+%Lfi\n", real(w), imag(w)); // log of -1 is imaginary pi w = log(long_double_complex(-1, 0)); printf("complex log(-1) = %Lf+%Lfi (difference from pi=%Lg)\n", real(w), imag(w), imag(w) - pi); // absolute value of a complex number is a real number: // the square root of the sum of the squares of the real // and imaginary parts printf("abs(float_complex(3,4)) = %f\n", abs(float_complex(3,4))); // You may raise a real number to a complex power x = pow(exp(1.0), double_complex(0., pi)); printf("e to the imaginary pi power = %f+%fi\n", real(x), imag(x)); // Or a complex number to a real power x = pow(double_complex(0, 1), 2.0); printf("i squared = %f+%fi\n", real(x), imag(x)); // Or a complex number to a complex power x = pow(double_complex(1, 1), double_complex(1, 1)); printf("(1+1i) to the power (1+1i) = %f+%fi\n", real(x), imag(x)); // Finally, square roots of negative numbers... x = sqrt(double_complex(-1.0, 0)); printf("square root of -1 = %g+%gi\n", real(x), imag(x)); // arg() returns the angle long double ld = arg(long_double_complex(1., 1.)); printf("arg(1+1i) = %Lf (difference from pi/4=%Lg)\n", ld, pi/4 - ld); // the conjugate of a complex number is the number with the // imaginary part's sign reversed. x = conj(double_complex(2., 3.)); printf("conj(2+3i)) = %g+%gi\n", real(x), imag(x)); // The complex trigonometric and hyperbolic functions x = double_complex(1,1); y = cos(x); printf("cos((1+1i)) = %f+%fi\n", real(y), imag(y)); y = sin(x); printf("sin((1+1i)) = %f+%fi\n", real(y), imag(y)); y = tan(x); printf("tan((1+1i)) = %f+%fi\n", real(y), imag(y)); y = cosh(x); printf("cosh((1+1i)) = %f+%fi\n", real(y), imag(y)); y = sinh(x); printf("sinh((1+1i)) = %f+%fi\n", real(y), imag(y)); y = tanh(x); printf("tanh((1+1i)) = %f+%fi\n", real(y), imag(y)); return 0; }