Listing 1: math-complex.h
// Compatibility file for C99 and C++ complex from May 2003
// C/C++ Users Journal.
//
// This header can be included by either C99 or ANSI C++
// programs to allow both real and complex floating point
// arithmetic to be written in a common subset of C99 & C++.
// Note that overloads for both the real and complex math
// functions are available after this header has been
// included.
#ifndef MATH_COMPLEX_H_INCLUDED
#define MATH_COMPLEX_H_INCLUDED
#ifdef __cplusplus
#include <cmath>
#include <complex>
using namespace std;
typedef complex<float> float_complex;
typedef complex<double> double_complex;
typedef complex<long double> long_double_complex;
// Since C99 does not have type-generics for modf of float
// and long double and C++ does not have the suffixed names,
// provide suffixed names for C++.
// Note: Some C++ implementations do not yet support the
// overloaded modf function called by these inlines.
inline float modff(float xf, float *pxf)
{return modf(xf, pxf);}
inline long double modfl(long double xl, long double *pxl)
{return modf(xl, pxl);}
#else
// Note that <tgmath.h> includes <math.h> and <complex.h>
#include <tgmath.h>
typedef float complex float_complex;
typedef double complex double_complex;
typedef long double complex long_double_complex;
#define float_complex(r,i) ((float)(r) + ((float)(i))*I)
#define double_complex(r,i) ((double)(r) + ((double)(i))*I)
#define long_double_complex(r,i) ((long double)(r) + ((long double)(i))*I)
#define real(x) creal(x)
#define imag(x) cimag(x)
#define abs(x) fabs(x)
#define arg(x) carg(x)
#endif // #ifdef __cplusplus
#endif // #ifndef MATH_COMPLEX_H_INCLUDED