COMPLEX.H(3HEAD) | Headers | COMPLEX.H(3HEAD) |

complex.h, complex - complex arithmetic

#include <complex.h>

The <**complex.h**> header defines the following
macros:

**complex**

Expands to **_Complex**.

**_Complex_I**

Expands to a constant expression of type const float
**_Complex**, with the value of the imaginary unit (that is, a number i
such that i^2=−1).

**imaginary**

Expands to **_Imaginary**.

**_Imaginary_I**

Expands to a constant expression of type **const float
_Imaginary** with the value of the imaginary unit.

**I**

Expands to either **_Imaginary_I** or
**_Complex_I**. If **_Imaginary_I** is not defined, **I** expands to
**_Complex_I**.

An application can undefine and then, if appropriate, redefine the
**complex**, **imaginary**, and **I** macros.

Values are interpreted as radians, not degrees.

See attributes(7) for descriptions of the following attributes:

ATTRIBUTE TYPE | ATTRIBUTE VALUE |

Interface Stability | Standard |

cabs(3M), cacos(3M), cacosh(3M), carg(3M), casin(3M), casinh(3M), catan(3M), catanh(3M), ccos(3M), ccosh(3M), cexp(3M), cimag(3M), clog(3M), conj(3M), cpow(3M), cproj(3M), creal(3M), csin(3M), csinh(3M), csqrt(3M), ctan(3M), ctanh(3M), attributes(7), standards(7)

The choice of **I** instead of **i** for the imaginary unit
concedes to the widespread use of the identifier **i** for other
purposes. The application can use a different identifier, say **j**, for
the imaginary unit by following the inclusion of the
<**complex.h**> header with:

#undef I #define j _Imaginary_I

An **I** suffix to designate imaginary constants is not
required, as multiplication by **I** provides a sufficiently convenient
and more generally useful notation for imaginary terms. The corresponding
real type for the imaginary unit is **float**, so that use of **I**
for algorithmic or notational convenience does not result in widening
types.

On systems with imaginary types, the application has the ability
to control whether use of the macro **I** introduces an imaginary type,
by explicitly defining **I** to be **_Imaginary_I** or
**_Complex_I**.

Disallowing imaginary types is useful for some applications intended to run on implementations without support for such types.

The macro **_Imaginary_I** provides a test for whether
imaginary types are supported. The **cis()** function **(cos(x) +
I*sin(x))** was considered but rejected because its implementation is easy
and straightforward, even though some implementations could compute sine and
cosine more efficiently in tandem.

December 17, 2003 | OmniOS |