# The Complex Class

This chapter describes:
• How to use complex numbers with the class complex
• Functions in the library:
• Constructor function
• Operator functions
• Complex functions
• Trigonometric and hyperbolic functions
• Mathematical functions
Class complex is implemented as a set of overloaded operators and functions that perform general complex mathematics. A complex number has two data members: a real and an imaginary part. Both are of type double.

This class implements complex numbers. Using overloaded functions and operators, you can treat complex numbers like you treat reals or integers. You can use the following:

• Arithmetic operators (+, -, /, *), relational operators (==, !=), and logical operators (&&, ||)
• Stream operators << and >>.
• Mathematical functions, such as sqrt() and log10().

## Using the Complex Class

To use complex numbers, add the library complex to your project and include file oldcomplex.h in your file, in a statement like this:
```#include <oldcomplex.h>
```
You can declare a complex variable three ways: uninitialized, initialized with two numbers, or initialized with another complex number. For example:
```complex z1;		// Uninitialized
complex z2(1.0,2.0);	// Initialized with two numbers
complex z3 = z2;	// Initialized with a complex number
```
To access components of a complex number, use member functions complex::real() and complex::imag(). For example:
```complex z1, z2(5.0,6.0);
z1.real() = z2.imag();
z1.imag() = z2.real();
```
To print or read a complex number, use stream operators operator>> and operator<<. For example, this program:
```#include <complex.h>
#include <iostream.h>

int main()
{
complex z1(1.1, 2.0), z2;
cout << "Enter z2: ";
cin >> z2;
cout << "z1 = " << z1 << '\n';
cout << "z2 = " << z2 << '\n';
return 0;
}
```
prints this:
```Enter z2: 10 9.8
z1 = (1.1, 2)
z2 = (10,9.8)
```
You can also use a complex number in the middle of a statement. For example, this line prints out the sine of (1, 1):
```cout << sin(complex(1,1));
```
Note: To invoke the complex version of a function, one of its arguments must be complex. For example, to figure the square root of -1, you must use sqrt(complex(-1,0)).

### Member Functions

The five types of class member functions are:
• Constructors
• Operators
• Complex
• Trigonometric and hyperbolic
• Mathematical

### Constructor Function

The following function is a constructor function.

## complex::complex()

oldcomplex.h
Prototype
complex::complex();
complex::complex(double re, double im);
complex::complex(const complex& z);
Description
The first constructor creates an unitialized complex number. For example:
```complex z;
```
The second constructor creates a complex number with the real part initialized to re and the imaginary part initialized to im. For example:
```complex z1(1.2,3.0), z2(3,4);
```
The third constructor creates a copy of a complex number. It is also called the X(X&) constructor. For example:

```#include <oldcomplex.h>

complex complexFunc()
{
// Invokes complex(double, double)
complex z1(2.0,4.0);

// Invokes complex(const complex&)
complex z2 = z1;

// Invokes complex(const complex&) to
// create a temporary variable and adds
// it to z1.
return complex(1.1, 2.2) + z1;
}
```

### Operator Functions

The operators defined for complex are overloaded to have the same meaning as the built-in operators. For example, + is the addition of two complex variables just as it is used for the addition of two variables of type double. The operators in the complex class have the usual operator precedence.

The five types of operators defined for the complex class are:

 arithmetic operator+ operator- operator* operator/ relational operator&& operator|| operator! operator== assignment complex::operator= complex::operator+= complex::operator-= complex::operator* complex::operator/ unary complex::operator- complex::operator! stream operator<< operator>>

## complex::operator=

oldcomplex.h
Prototype
complex& complex::operator=(const complex& z);
complex& complex::operator=(double u);
Description
Assigns a value to complex variable.

## complex::operator+=

oldcomplex.h
Prototype
complex& complex::operator+=(const complex& z);
complex& complex::operator+=(double u);
Description
Adds a value to a complex variable and assigns the result to the complex variable.

## complex::operator-=

oldcomplex.h
Prototype
complex& complex::operator-=(const complex& z);
complex& complex::operator-=(double u);
Description
Subtracts a value from a complex variable and assigns the result to the complex variable.

## complex::operator*=

oldcomplex.h
Prototype
complex& complex::operator*=(const complex& z);
complex& complex::operator*=(double u);
Description
Multiplies a value by a complex variable and assigns the result to the complex variable.

## complex::operator/=

oldcomplex.h
Prototype
complex& complex::operator/=(const complex& z);
complex& complex::operator/=(double u);
Description
Divides a complex variable by a value and assigns the result to the complex variable.

## complex::operator-

oldcomplex.h
Prototype
complex complex::operator-() const;
Description
Returns the negative of a complex number.

## complex::operator!

oldcomplex.h
Prototype
int complex::operator!() const;
Description
Performs logical negation on a complex number.

## operator+

oldcomplex.h
Prototype
complex operator+(const complex& z1, complex& z2);
complex operator+(double u, const complex& z);
complex operator+(const complex& z, double u);
Description
Returns the sum of a complex number and any other number.

## operator-

oldcomplex.h
Prototype
complex operator-(const complex& z1, const complex& z2);
complex operator-(double u, const complex& z);
complex operator-(const complex& z, double u);
Description
Returns the difference of a complex number and any other number.

## operator*

oldcomplex.h
Prototype
complex operator*(const complex& z1, const complex& z2);
complex operator*(double u, const complex& z);
complex operator*(const complex& z, double u);
Description
Returns the product of a complex number and any other number.

## operator/

oldcomplex.h
Prototype
complex operator/(const complex& z1, const complex& z2);
complex operator/(double u, const complex& z);
complex operator/(const complex& z, double u);
Description
Returns the quotient of a complex number and any other number.

## operator&&

oldcomplex.h
Prototype
complex operator&&(const complex& z1, const complex& z2);
complex operator&&(double u, const complex& z);
complex operator&&(const complex& z, double u);
Description
Performs logical AND. Returns 0 if both arguments are 0 or (0, 0).

## operator||

oldcomplex.h
Prototype
complex operator||(const complex& z1, const complex& z2);
complex operator||(double u, const complex& z);
complex operator||(const complex& z, double u);
Description
Performs logical OR. Returns 0 if both arguments are 0 or (0, 0).

## operator!

oldcomplex.h
Prototype
complex operator!=(const complex& z1, const complex& z2);
complex operator!=(double u, const complex& z);
complex operator!=(const complex& z, double u);
Description
Tests for inequality.

## operator==

oldcomplex.h
Prototype
complex ::operator==(const complex& z1, const complex& z2);
complex ::operator==(double u, const complex& z);
complex ::operator==(const complex& z, double u);
Description
Tests for equality.

## operator<<

oldcomplex.h
Prototype
ostream& operator<<(ostream& s, const complex& z);
Description
Reads z from the stream s, in the form(real, imaginary).

## operator>>

oldcomplex.h
Prototype
istream& operator>>(istream& s, const complex& z);
Description
Reads z from the stream s, in the form(real, imaginary).

## Complex Functions

The complex functions are unique to the complex type and do not overload names of the ANSI C math library.

## arg

oldcomplex.h
Prototype
double arg(const complex& z);
Description
The arg function determines the angle, in radians, of the number in
the complex plane specified in the x argument. The positive real axis
has angle 0; the positive imaginary axis has angle pi/2.

The arg function is equivalent to:

```atan2(imag(x), real(x))
```
Return Value
Returns the argument of the complex number z in radians.

## complex::imag, complex::real

oldcomplex.h
Prototype
double& complex::imag();
double& complex::real();
Description
complex::imag returns the imaginary portion of a complex number; complex::real returns the real portion. Either function can be on the left side or right side of an assignment statement.
Example
```For complex::imag 		For complex::real

#include <oldcomplex.h> 	#include <oldcomplex.h>

complex z1(1.0,2.0), z2; 	complex z1(1.0,2.0), z2;
z1.imag() = z2.imag(); 		z1.real() = z2.real();
```

## conj

oldcomplex.h
Prototype
complex conj(const complex& z);
Description
Returns the complex conjugate of a complex number. If the complex number z is x+iy, then conj(z) is x-iy.

## imag

oldcomplex.h
Prototype
double imag(const complex& z);
Description
Returns the imaginary portion of a complex number. It can be on only the right side of an assignment statement.

## modulus

oldcomplex.h
Prototype
double modulus(const complex& z);
Description
Returns the absolute value of a complex number. The absolute value of a complex number is also called the modulus. modulus(z) is equal to abs(z), which is sqrt (x * x + y * y).

## norm

oldcomplex.h
Prototype
double norm(const complex& z);
Description
Returns the square of the absolute value of a complex number. For z, of form (x + iy), conj(z) = (x * x + y * y).

## polar

oldcomplex.h
Prototype
complex polar(double range, double theta);
Description
Returns the complex number that is the result of converting polar coordinates range and theta to x and y coordinates. This is equivalent to using the formula:
```complex(range * cos(theta), range * sin(theta));
```

## real

oldcomplex.h
Prototype
double real(const complex& z);
Description
Returns the real portion of a complex number. It can be on only the right side of an assignment statement.

## Trigonometric and hyperbolic functions

The trigonometric and hyperbolic functions overload the names of ANSI C library floating-point trigonometric and hyperbolic functions.

## acos

oldcomplex.h
Prototype
complex acos(const complex& z);
Description
Returns the arccosine of a complex number.

## asin, asinh

oldcomplex.h
Prototype
complex asin(const complex& z);
complex asinh(const complex& z);
Description
asin returns the arcsine of a complex number. asinh returns the hyperbolic arcsine of a complex number.

## atan, atanh

oldcomplex.h
Prototype
complex atan(const complex& z);
complex atanh(const complex& z);
Description
atan returns the arctangent of a complex number. atanh returns the hyperbolic arctangent of a complex number.

## cos, cosh

oldcomplex.h
Prototype
complex cos(const complex& z);
complex cosh(const complex& z);
Description
cos returns the cosine of a complex number. cosh returns the hyperbolic cosine of a complex number.

## sin, sinh

oldcomplex.h
Prototype
complex sin (const complex& z);
complex sinh(const complex& z);
Description
sin returns the sine of a complex number. sinh returns the hyperbolic sine of a complex number.

## tan, tanh

oldcomplex.h
Prototype
complex tan(const complex& z);
complex tanh(const complex& z);
Description
tan returns the tangent of a complex number. tanh returns the hyperbolic tangent of a complex number.

## Mathematical functions

The mathematical functions overload functions contained in the ANSI C math library to provide consistent complex support.

## abs

oldcomplex.h
Prototype
double abs(const complex&);
Description
Returns the absolute value of a complex number.

## exp

oldcomplex.h
Prototype
complex exp(const complex&);
Description
Returns the value of e raised to a complex number.

## log, log10

oldcomplex.h
Prototype
complex log(const complex&);
complex log10(const complex&);
Description
log returns the logarithm base e of a complex number. log10 returns the logarithm base 10 of a complex number.

## pow

oldcomplex.h
Prototype
complex pow(const complex&, double);
complex pow(const complex&, const complex &);
complex pow(double, const complex&);
complex pow(const complex&, int);
Description
Returns any number raised to a complex number or vice versa.