# Struct num_complex::Complex[−][src]

```#[repr(C)]pub struct Complex<T> {
pub re: T,
pub im: T,
}```

A complex number in Cartesian form.

## Representation and Foreign Function Interface Compatibility

`Complex<T>` is memory layout compatible with an array `[T; 2]`.

Note that `Complex<F>` where F is a floating point type is only memory layout compatible with C’s complex types, not necessarily calling convention compatible. This means that for FFI you can only pass `Complex<F>` behind a pointer, not as a value.

## Examples

Example of extern function declaration.

```use num_complex::Complex;
use std::os::raw::c_int;

extern "C" {
fn zaxpy_(n: *const c_int, alpha: *const Complex<f64>,
x: *const Complex<f64>, incx: *const c_int,
y: *mut Complex<f64>, incy: *const c_int);
}```

## Fields

`re: T`

Real portion of the complex number

`im: T`

Imaginary portion of the complex number

## Implementations

### `impl<T> Complex<T>`[src]

#### `pub const fn new(re: T, im: T) -> Self`[src]

Create a new Complex

### `impl<T: Clone + Num> Complex<T>`[src]

#### `pub fn i() -> Self`[src]

Returns imaginary unit

#### `pub fn norm_sqr(&self) -> T`[src]

Returns the square of the norm (since `T` doesn’t necessarily have a sqrt function), i.e. `re^2 + im^2`.

#### `pub fn scale(&self, t: T) -> Self`[src]

Multiplies `self` by the scalar `t`.

#### `pub fn unscale(&self, t: T) -> Self`[src]

Divides `self` by the scalar `t`.

#### `pub fn powu(&self, exp: u32) -> Self`[src]

Raises `self` to an unsigned integer power.

### `impl<T: Clone + Num + Neg<Output = T>> Complex<T>`[src]

#### `pub fn conj(&self) -> Self`[src]

Returns the complex conjugate. i.e. `re - i im`

#### `pub fn inv(&self) -> Self`[src]

Returns `1/self`

#### `pub fn powi(&self, exp: i32) -> Self`[src]

Raises `self` to a signed integer power.

### `impl<T: Clone + Signed> Complex<T>`[src]

#### `pub fn l1_norm(&self) -> T`[src]

Returns the L1 norm `|re| + |im|` – the Manhattan distance from the origin.

### `impl<T: Float> Complex<T>`[src]

Calculate |self|

#### `pub fn arg(self) -> T`[src]

Calculate the principal Arg of self.

#### `pub fn to_polar(self) -> (T, T)`[src]

Convert to polar form (r, theta), such that `self = r * exp(i * theta)`

#### `pub fn from_polar(r: T, theta: T) -> Self`[src]

Convert a polar representation into a complex number.

#### `pub fn exp(self) -> Self`[src]

Computes `e^(self)`, where `e` is the base of the natural logarithm.

#### `pub fn ln(self) -> Self`[src]

Computes the principal value of natural logarithm of `self`.

This function has one branch cut:

• `(-∞, 0]`, continuous from above.

The branch satisfies `-π ≤ arg(ln(z)) ≤ π`.

#### `pub fn sqrt(self) -> Self`[src]

Computes the principal value of the square root of `self`.

This function has one branch cut:

• `(-∞, 0)`, continuous from above.

The branch satisfies `-π/2 ≤ arg(sqrt(z)) ≤ π/2`.

#### `pub fn cbrt(self) -> Self`[src]

Computes the principal value of the cube root of `self`.

This function has one branch cut:

• `(-∞, 0)`, continuous from above.

The branch satisfies `-π/3 ≤ arg(cbrt(z)) ≤ π/3`.

Note that this does not match the usual result for the cube root of negative real numbers. For example, the real cube root of `-8` is `-2`, but the principal complex cube root of `-8` is `1 + i√3`.

#### `pub fn powf(self, exp: T) -> Self`[src]

Raises `self` to a floating point power.

#### `pub fn log(self, base: T) -> Self`[src]

Returns the logarithm of `self` with respect to an arbitrary base.

#### `pub fn powc(self, exp: Self) -> Self`[src]

Raises `self` to a complex power.

#### `pub fn expf(self, base: T) -> Self`[src]

Raises a floating point number to the complex power `self`.

#### `pub fn sin(self) -> Self`[src]

Computes the sine of `self`.

#### `pub fn cos(self) -> Self`[src]

Computes the cosine of `self`.

#### `pub fn tan(self) -> Self`[src]

Computes the tangent of `self`.

#### `pub fn asin(self) -> Self`[src]

Computes the principal value of the inverse sine of `self`.

This function has two branch cuts:

• `(-∞, -1)`, continuous from above.
• `(1, ∞)`, continuous from below.

The branch satisfies `-π/2 ≤ Re(asin(z)) ≤ π/2`.

#### `pub fn acos(self) -> Self`[src]

Computes the principal value of the inverse cosine of `self`.

This function has two branch cuts:

• `(-∞, -1)`, continuous from above.
• `(1, ∞)`, continuous from below.

The branch satisfies `0 ≤ Re(acos(z)) ≤ π`.

#### `pub fn atan(self) -> Self`[src]

Computes the principal value of the inverse tangent of `self`.

This function has two branch cuts:

• `(-∞i, -i]`, continuous from the left.
• `[i, ∞i)`, continuous from the right.

The branch satisfies `-π/2 ≤ Re(atan(z)) ≤ π/2`.

#### `pub fn sinh(self) -> Self`[src]

Computes the hyperbolic sine of `self`.

#### `pub fn cosh(self) -> Self`[src]

Computes the hyperbolic cosine of `self`.

#### `pub fn tanh(self) -> Self`[src]

Computes the hyperbolic tangent of `self`.

#### `pub fn asinh(self) -> Self`[src]

Computes the principal value of inverse hyperbolic sine of `self`.

This function has two branch cuts:

• `(-∞i, -i)`, continuous from the left.
• `(i, ∞i)`, continuous from the right.

The branch satisfies `-π/2 ≤ Im(asinh(z)) ≤ π/2`.

#### `pub fn acosh(self) -> Self`[src]

Computes the principal value of inverse hyperbolic cosine of `self`.

This function has one branch cut:

• `(-∞, 1)`, continuous from above.

The branch satisfies `-π ≤ Im(acosh(z)) ≤ π` and `0 ≤ Re(acosh(z)) < ∞`.

#### `pub fn atanh(self) -> Self`[src]

Computes the principal value of inverse hyperbolic tangent of `self`.

This function has two branch cuts:

• `(-∞, -1]`, continuous from above.
• `[1, ∞)`, continuous from below.

The branch satisfies `-π/2 ≤ Im(atanh(z)) ≤ π/2`.

#### `pub fn finv(self) -> Complex<T>`[src]

Returns `1/self` using floating-point operations.

This may be more accurate than the generic `self.inv()` in cases where `self.norm_sqr()` would overflow to ∞ or underflow to 0.

# Examples

```use num_complex::Complex64;
let c = Complex64::new(1e300, 1e300);

// The generic `inv()` will overflow.
assert!(!c.inv().is_normal());

// But we can do better for `Float` types.
let inv = c.finv();
assert!(inv.is_normal());
println!("{:e}", inv);

let expected = Complex64::new(5e-301, -5e-301);
assert!((inv - expected).norm() < 1e-315);```

#### `pub fn fdiv(self, other: Complex<T>) -> Complex<T>`[src]

Returns `self/other` using floating-point operations.

This may be more accurate than the generic `Div` implementation in cases where `other.norm_sqr()` would overflow to ∞ or underflow to 0.

# Examples

```use num_complex::Complex64;
let a = Complex64::new(2.0, 3.0);
let b = Complex64::new(1e300, 1e300);

// Generic division will overflow.
assert!(!(a / b).is_normal());

// But we can do better for `Float` types.
let quotient = a.fdiv(b);
assert!(quotient.is_normal());
println!("{:e}", quotient);

let expected = Complex64::new(2.5e-300, 5e-301);
assert!((quotient - expected).norm() < 1e-315);```

### `impl<T: FloatCore> Complex<T>`[src]

#### `pub fn is_nan(self) -> bool`[src]

Checks if the given complex number is NaN

#### `pub fn is_infinite(self) -> bool`[src]

Checks if the given complex number is infinite

#### `pub fn is_finite(self) -> bool`[src]

Checks if the given complex number is finite

#### `pub fn is_normal(self) -> bool`[src]

Checks if the given complex number is normal

## Trait Implementations

### `impl<'a, T: Clone + Num> Add<&'a Complex<T>> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `+` operator.

### `impl<'a, T: Clone + Num> Add<&'a T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `+` operator.

### `impl<'a, 'b, T: Clone + Num> Add<&'a T> for &'b Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `+` operator.

### `impl<'a, 'b, T: Clone + Num> Add<&'b Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `+` operator.

### `impl<'a, T: Clone + Num> Add<Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `+` operator.

### `impl<T: Clone + Num> Add<Complex<T>> for Complex<T>`[src]

#### `type Output = Self`

The resulting type after applying the `+` operator.

### `impl<T: Clone + Num> Add<T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `+` operator.

### `impl<'a, T: Clone + Num> Add<T> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `+` operator.

### `impl<'a, T: Clone + Num> Div<&'a Complex<T>> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `/` operator.

### `impl<'a, T: Clone + Num> Div<&'a T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `/` operator.

### `impl<'a, 'b, T: Clone + Num> Div<&'a T> for &'b Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `/` operator.

### `impl<'a, 'b, T: Clone + Num> Div<&'b Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `/` operator.

### `impl<'a, T: Clone + Num> Div<Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `/` operator.

### `impl<T: Clone + Num> Div<Complex<T>> for Complex<T>`[src]

#### `type Output = Self`

The resulting type after applying the `/` operator.

### `impl<T: Clone + Num> Div<T> for Complex<T>`[src]

#### `type Output = Self`

The resulting type after applying the `/` operator.

### `impl<'a, T: Clone + Num> Div<T> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `/` operator.

### `impl<T> FromStr for Complex<T> where    T: FromStr + Num + Clone, `[src]

#### `type Err = ParseComplexError<T::Err>`

The associated error which can be returned from parsing.

#### `fn from_str(s: &str) -> Result<Self, Self::Err>`[src]

Parses `a +/- bi`; `ai +/- b`; `a`; or `bi` where `a` and `b` are of type `T`

### `impl<T: Clone + Num + Neg<Output = T>> Inv for Complex<T>`[src]

#### `type Output = Self`

The result after applying the operator.

### `impl<'a, T: Clone + Num + Neg<Output = T>> Inv for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num> Mul<&'a Complex<T>> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `*` operator.

### `impl<'a, T: Clone + Num> Mul<&'a T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `*` operator.

### `impl<'a, 'b, T: Clone + Num> Mul<&'a T> for &'b Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `*` operator.

### `impl<'a, 'b, T: Clone + Num> Mul<&'b Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `*` operator.

### `impl<'a, T: Clone + Num> Mul<Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `*` operator.

### `impl<T: Clone + Num> Mul<Complex<T>> for Complex<T>`[src]

#### `type Output = Self`

The resulting type after applying the `*` operator.

### `impl<T: Clone + Num> Mul<T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `*` operator.

### `impl<'a, T: Clone + Num> Mul<T> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `*` operator.

### `impl<'a, 'b, T: Clone + Num + MulAdd<Output = T>> MulAdd<&'b Complex<T>, &'a Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the fused multiply-add.

### `impl<T: Clone + Num + MulAdd<Output = T>> MulAdd<Complex<T>, Complex<T>> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the fused multiply-add.

### `impl<T: Clone + Num + Neg<Output = T>> Neg for Complex<T>`[src]

#### `type Output = Self`

The resulting type after applying the `-` operator.

### `impl<'a, T: Clone + Num + Neg<Output = T>> Neg for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `-` operator.

### `impl<T: Num + Clone> Num for Complex<T>`[src]

#### `fn from_str_radix(s: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr>`[src]

Parses `a +/- bi`; `ai +/- b`; `a`; or `bi` where `a` and `b` are of type `T`

### `impl<'a, 'b, T: Float> Pow<&'b Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'b, T: Float> Pow<&'b Complex<T>> for Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Float> Pow<&'b f32> for &'a Complex<T> where    f32: Into<T>, `[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'b, T: Float> Pow<&'b f32> for Complex<T> where    f32: Into<T>, `[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Float> Pow<&'b f64> for &'a Complex<T> where    f64: Into<T>, `[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'b, T: Float> Pow<&'b f64> for Complex<T> where    f64: Into<T>, `[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num + Neg<Output = T>> Pow<&'b i128> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num + Neg<Output = T>> Pow<&'b i16> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num + Neg<Output = T>> Pow<&'b i32> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num + Neg<Output = T>> Pow<&'b i64> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num + Neg<Output = T>> Pow<&'b i8> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num + Neg<Output = T>> Pow<&'b isize> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num> Pow<&'b u128> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num> Pow<&'b u16> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num> Pow<&'b u32> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num> Pow<&'b u64> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num> Pow<&'b u8> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, 'b, T: Clone + Num> Pow<&'b usize> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Float> Pow<Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<T: Float> Pow<Complex<T>> for Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Float> Pow<f32> for &'a Complex<T> where    f32: Into<T>, `[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<T: Float> Pow<f32> for Complex<T> where    f32: Into<T>, `[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Float> Pow<f64> for &'a Complex<T> where    f64: Into<T>, `[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<T: Float> Pow<f64> for Complex<T> where    f64: Into<T>, `[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num + Neg<Output = T>> Pow<i128> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num + Neg<Output = T>> Pow<i16> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num + Neg<Output = T>> Pow<i32> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num + Neg<Output = T>> Pow<i64> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num + Neg<Output = T>> Pow<i8> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num + Neg<Output = T>> Pow<isize> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num> Pow<u128> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num> Pow<u16> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num> Pow<u32> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num> Pow<u64> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num> Pow<u8> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num> Pow<usize> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The result after applying the operator.

### `impl<'a, T: Clone + Num> Rem<&'a Complex<T>> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `%` operator.

### `impl<'a, T: Clone + Num> Rem<&'a T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `%` operator.

### `impl<'a, 'b, T: Clone + Num> Rem<&'a T> for &'b Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `%` operator.

### `impl<'a, 'b, T: Clone + Num> Rem<&'b Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `%` operator.

### `impl<'a, T: Clone + Num> Rem<Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `%` operator.

### `impl<T: Clone + Num> Rem<Complex<T>> for Complex<T>`[src]

#### `type Output = Self`

The resulting type after applying the `%` operator.

### `impl<T: Clone + Num> Rem<T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `%` operator.

### `impl<'a, T: Clone + Num> Rem<T> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `%` operator.

### `impl<'a, T: Clone + Num> Sub<&'a Complex<T>> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `-` operator.

### `impl<'a, T: Clone + Num> Sub<&'a T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `-` operator.

### `impl<'a, 'b, T: Clone + Num> Sub<&'a T> for &'b Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `-` operator.

### `impl<'a, 'b, T: Clone + Num> Sub<&'b Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `-` operator.

### `impl<'a, T: Clone + Num> Sub<Complex<T>> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `-` operator.

### `impl<T: Clone + Num> Sub<Complex<T>> for Complex<T>`[src]

#### `type Output = Self`

The resulting type after applying the `-` operator.

### `impl<T: Clone + Num> Sub<T> for Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `-` operator.

### `impl<'a, T: Clone + Num> Sub<T> for &'a Complex<T>`[src]

#### `type Output = Complex<T>`

The resulting type after applying the `-` operator.

## Blanket Implementations

### `impl<T> ToOwned for T where    T: Clone, `[src]

#### `type Owned = T`

The resulting type after obtaining ownership.

### `impl<T, U> TryFrom<U> for T where    U: Into<T>, `[src]

#### `type Error = Infallible`

The type returned in the event of a conversion error.

### `impl<T, U> TryInto<U> for T where    U: TryFrom<T>, `[src]

#### `type Error = <U as TryFrom<T>>::Error`

The type returned in the event of a conversion error.