Complex number arithmetic

From cppreference.com
< c‎ | numeric

The header <complex.h> defines macros and declares functions that support complex number arithmetic. Complex values are values of type double complex, float complex, long double complex,

If the macro constant __STDC_IEC_559_COMPLEX__(C99) is defined by the compiler, in addition to the complex types, the imaginary types are also supported: double imaginary, float imaginary, and long double imaginary. When a value of imaginary type is converted to a value of complex type, the resulting complex type has its real component set to zero. When a value of complex type is converted to a value of imaginary type, the real component is discarded.

Standard arithmetic operators +, -, *, / can be used with real, complex, and imaginary types in any combination.

If the macro constant __STDC_NO_COMPLEX__(C11) is defined by the compiler, the header <complex.h> and all of the names listed here are not provided.

If #pragma STDC CX_LIMITED_RANGE on is used, complex multiplication, division, and absolute value may use simplified mathematical formulas, despite the possibility of intermediate overflow.

Defined in header <complex.h>

Contents

Types
(C99)
imaginary type macro
(macro constant)
(C99)
complex type macro
(macro constant)
The imaginary constant
the imaginary unit constant i
(macro constant)
(C99)
the complex unit constant i
(macro constant)
(C99)
the complex or imaginary unit constant i
(macro constant)
Manipulation
(C11)(C11)(C11)
constructs a complex number from real and imaginary parts
(function macro)
(C99)(C99)(C99)
computes the real part of a complex number
(function)
(C99)(C99)(C99)
computes the imaginary part a complex number
(function)
(C99)(C99)(C99)
computes the magnitude of a complex number
(function)
(C99)(C99)(C99)
computes the phase angle of a complex number
(function)
(C99)(C99)(C99)
computes the complex conjugate
(function)
(C99)(C99)(C99)
computes the projection on Riemann sphere
(function)
Exponential functions
(C99)(C99)(C99)
computes the complex base-e exponential
(function)
(C99)(C99)(C99)
computes the complex natural logarithm
(function)
Power functions
(C99)(C99)(C99)
computes the complex power function
(function)
(C99)(C99)(C99)
computes the complex square root
(function)
Trigonometric functions
(C99)(C99)(C99)
computes the complex sine
(function)
(C99)(C99)(C99)
computes the complex cosine
(function)
(C99)(C99)(C99)
computes the complex tangent
(function)
(C99)(C99)(C99)
computes the complex arc sine
(function)
(C99)(C99)(C99)
computes the complex arc cosine
(function)
(C99)(C99)(C99)
computes the complex arc tangent
(function)
Hyperbolic functions
(C99)(C99)(C99)
computes the complex hyperbolic sine
(function)
(C99)(C99)(C99)
computes the complex hyperbolic cosine
(function)
(C99)(C99)(C99)
computes the complex hyperbolic tangent
(function)
(C99)(C99)(C99)
computes the complex arc hyperbolic sine
(function)
(C99)(C99)(C99)
computes the complex arc hyperbolic cosine
(function)
(C99)(C99)(C99)
computes the complex arc hyperbolic tangent
(function)

[edit] Notes

Although the C standard names the inverse hyperbolics with "complex arc hyperbolic sine" etc., the inverse functions of the hyperbolic functions are the area functions. Their argument is the area of a hyperbolic sector, not an arc. The correct names are "complex inverse hyperbolic sine" etc. Some authors use "complex area hyperbolic sine" etc.

[edit] Example

#include <stdio.h>
#include <complex.h>
 
int main(void)
{
    #ifdef __STDC_IEC_559_COMPLEX__
           printf("_STDC_IEC_559_COMPLEX__ defined\n");
    #else
           printf("_STDC_IEC_559_COMPLEX__ not defined\n");
    #endif
    #ifdef __STDC_NO_COMPLEX__
           printf("__STDC_NO_COMPLEX__ defined\n");
    #else
           printf("__STDC_NO_COMPLEX__ not defined\n");
    #endif
    printf("\n");
 
    printf("%2zu\n", sizeof(float complex));           /*  8 */
    printf("%2zu\n", sizeof(double complex));          /* 16 */
    printf("%2zu\n", sizeof(long double complex));     /* implementation-defined */
 
    /* Two macros represent the imaginary unit “i”: */
    /*      _Complex_I                              */
    /*      I                                       */
    printf("%.1f%+.1fi\n", creal(_Complex_I),cimag(_Complex_I));
    printf("%.1f%+.1fi\n", creal(I),cimag(I));
 
    /* The central property of the imaginary unit:  i*i is -1. */
    printf("%.1f%+.1fi\n", creal(1.0*_Complex_I*1.0*_Complex_I),
                           cimag(1.0*_Complex_I*1.0*_Complex_I));
    printf("%.1f%+.1fi\n", creal(1.0*I*1.0*I),cimag(1.0*I*1.0*I));
 
    /* Use the macros to define complex constants. */
    double complex z1 = 1.0 + 2.0*I;
    double complex z2 = 2.0 + 4.0*_Complex_I;
 
    /* Sum and print. */
    double complex z3 = z1+z2;
    printf("%.1f%+.1fi\n", creal(z3),cimag(z3));
 
    /* When the macro named "I" conflicts in an application, */
    /* define a new macro named "J" or "j".                  */
    #undef I
    #define J _Complex_I
    z1 = 1.5 + 2.5*J;
 
    return 0;
}

Possible output:

_STDC_IEC_559_COMPLEX__ defined
__STDC_NO_COMPLEX__ not defined
 
 8
16
32
0.0+1.0i
0.0+1.0i
-1.0+0.0i
-1.0+0.0i
3.0+6.0i

[edit] See also

C++ documentation for Complex number arithmetic