#[repr(C)]pub struct Complex<T> {
    pub re: T,
    pub im: T,
}Expand description
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: TReal portion of the complex number
im: TImaginary portion of the complex number
Implementations§
Source§impl<T: Clone + Num> Complex<T>
 
impl<T: Clone + Num> Complex<T>
Source§impl<T: Clone + Signed> Complex<T>
 
impl<T: Clone + Signed> Complex<T>
Sourcepub fn l1_norm(&self) -> T
 
pub fn l1_norm(&self) -> T
Returns the L1 norm |re| + |im| – the Manhattan distance from the origin.
Source§impl<T: Clone + Float> Complex<T>
 
impl<T: Clone + Float> Complex<T>
Sourcepub fn to_polar(&self) -> (T, T)
 
pub fn to_polar(&self) -> (T, T)
Convert to polar form (r, theta), such that
self = r * exp(i * theta)
Sourcepub fn from_polar(r: &T, theta: &T) -> Self
 
pub fn from_polar(r: &T, theta: &T) -> Self
Convert a polar representation into a complex number.
Sourcepub fn ln(&self) -> Self
 
pub fn ln(&self) -> Self
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)) ≤ π.
Sourcepub fn sqrt(&self) -> Self
 
pub fn sqrt(&self) -> Self
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.
Sourcepub fn cbrt(&self) -> Self
 
pub fn cbrt(&self) -> Self
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.
Sourcepub fn log(&self, base: T) -> Self
 
pub fn log(&self, base: T) -> Self
Returns the logarithm of self with respect to an arbitrary base.
Sourcepub fn asin(&self) -> Self
 
pub fn asin(&self) -> Self
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.
Sourcepub fn acos(&self) -> Self
 
pub fn acos(&self) -> Self
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)) ≤ π.
Sourcepub fn atan(&self) -> Self
 
pub fn atan(&self) -> Self
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.
Sourcepub fn asinh(&self) -> Self
 
pub fn asinh(&self) -> Self
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.
Sourcepub fn acosh(&self) -> Self
 
pub fn acosh(&self) -> Self
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)) < ∞.
Sourcepub fn atanh(&self) -> Self
 
pub fn atanh(&self) -> Self
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.
Sourcepub fn finv(&self) -> Complex<T>
 
pub fn finv(&self) -> Complex<T>
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);Sourcepub fn fdiv(&self, other: Complex<T>) -> Complex<T>
 
pub fn fdiv(&self, other: Complex<T>) -> Complex<T>
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);Trait Implementations§
Source§impl<'a, T: Clone + NumAssign> AddAssign<&'a Complex<T>> for Complex<T>
 
impl<'a, T: Clone + NumAssign> AddAssign<&'a Complex<T>> for Complex<T>
Source§fn add_assign(&mut self, other: &Self)
 
fn add_assign(&mut self, other: &Self)
+= operation. Read moreSource§impl<'a, T: Clone + NumAssign> AddAssign<&'a T> for Complex<T>
 
impl<'a, T: Clone + NumAssign> AddAssign<&'a T> for Complex<T>
Source§fn add_assign(&mut self, other: &T)
 
fn add_assign(&mut self, other: &T)
+= operation. Read moreSource§impl<T: Clone + NumAssign> AddAssign<T> for Complex<T>
 
impl<T: Clone + NumAssign> AddAssign<T> for Complex<T>
Source§fn add_assign(&mut self, other: T)
 
fn add_assign(&mut self, other: T)
+= operation. Read moreSource§impl<T: Clone + NumAssign> AddAssign for Complex<T>
 
impl<T: Clone + NumAssign> AddAssign for Complex<T>
Source§fn add_assign(&mut self, other: Self)
 
fn add_assign(&mut self, other: Self)
+= operation. Read moreSource§impl<T, U> AsPrimitive<U> for Complex<T>where
    T: AsPrimitive<U>,
    U: 'static + Copy,
 
impl<T, U> AsPrimitive<U> for Complex<T>where
    T: AsPrimitive<U>,
    U: 'static + Copy,
Source§impl<'a, T: Clone + NumAssign> DivAssign<&'a Complex<T>> for Complex<T>
 
impl<'a, T: Clone + NumAssign> DivAssign<&'a Complex<T>> for Complex<T>
Source§fn div_assign(&mut self, other: &Self)
 
fn div_assign(&mut self, other: &Self)
/= operation. Read moreSource§impl<'a, T: Clone + NumAssign> DivAssign<&'a T> for Complex<T>
 
impl<'a, T: Clone + NumAssign> DivAssign<&'a T> for Complex<T>
Source§fn div_assign(&mut self, other: &T)
 
fn div_assign(&mut self, other: &T)
/= operation. Read moreSource§impl<T: Clone + NumAssign> DivAssign<T> for Complex<T>
 
impl<T: Clone + NumAssign> DivAssign<T> for Complex<T>
Source§fn div_assign(&mut self, other: T)
 
fn div_assign(&mut self, other: T)
/= operation. Read moreSource§impl<T: Clone + NumAssign> DivAssign for Complex<T>
 
impl<T: Clone + NumAssign> DivAssign for Complex<T>
Source§fn div_assign(&mut self, other: Self)
 
fn div_assign(&mut self, other: Self)
/= operation. Read moreSource§impl<T: FromPrimitive + Num> FromPrimitive for Complex<T>
 
impl<T: FromPrimitive + Num> FromPrimitive for Complex<T>
Source§fn from_usize(n: usize) -> Option<Self>
 
fn from_usize(n: usize) -> Option<Self>
usize to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_isize(n: isize) -> Option<Self>
 
fn from_isize(n: isize) -> Option<Self>
isize to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u8(n: u8) -> Option<Self>
 
fn from_u8(n: u8) -> Option<Self>
u8 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u16(n: u16) -> Option<Self>
 
fn from_u16(n: u16) -> Option<Self>
u16 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u32(n: u32) -> Option<Self>
 
fn from_u32(n: u32) -> Option<Self>
u32 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u64(n: u64) -> Option<Self>
 
fn from_u64(n: u64) -> Option<Self>
u64 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_i8(n: i8) -> Option<Self>
 
fn from_i8(n: i8) -> Option<Self>
i8 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_i16(n: i16) -> Option<Self>
 
fn from_i16(n: i16) -> Option<Self>
i16 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_i32(n: i32) -> Option<Self>
 
fn from_i32(n: i32) -> Option<Self>
i32 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_i64(n: i64) -> Option<Self>
 
fn from_i64(n: i64) -> Option<Self>
i64 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u128(n: u128) -> Option<Self>
 
fn from_u128(n: u128) -> Option<Self>
u128 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned. Read moreSource§fn from_i128(n: i128) -> Option<Self>
 
fn from_i128(n: i128) -> Option<Self>
i128 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned. Read moreSource§impl<'a, 'b, T: Clone + NumAssign + MulAddAssign> MulAddAssign<&'a Complex<T>, &'b Complex<T>> for Complex<T>
 
impl<'a, 'b, T: Clone + NumAssign + MulAddAssign> MulAddAssign<&'a Complex<T>, &'b Complex<T>> for Complex<T>
Source§fn mul_add_assign(&mut self, other: &Complex<T>, add: &Complex<T>)
 
fn mul_add_assign(&mut self, other: &Complex<T>, add: &Complex<T>)
*self = (*self * a) + bSource§impl<T: Clone + NumAssign + MulAddAssign> MulAddAssign for Complex<T>
 
impl<T: Clone + NumAssign + MulAddAssign> MulAddAssign for Complex<T>
Source§fn mul_add_assign(&mut self, other: Complex<T>, add: Complex<T>)
 
fn mul_add_assign(&mut self, other: Complex<T>, add: Complex<T>)
*self = (*self * a) + bSource§impl<'a, T: Clone + NumAssign> MulAssign<&'a Complex<T>> for Complex<T>
 
impl<'a, T: Clone + NumAssign> MulAssign<&'a Complex<T>> for Complex<T>
Source§fn mul_assign(&mut self, other: &Self)
 
fn mul_assign(&mut self, other: &Self)
*= operation. Read moreSource§impl<'a, T: Clone + NumAssign> MulAssign<&'a T> for Complex<T>
 
impl<'a, T: Clone + NumAssign> MulAssign<&'a T> for Complex<T>
Source§fn mul_assign(&mut self, other: &T)
 
fn mul_assign(&mut self, other: &T)
*= operation. Read moreSource§impl<T: Clone + NumAssign> MulAssign<T> for Complex<T>
 
impl<T: Clone + NumAssign> MulAssign<T> for Complex<T>
Source§fn mul_assign(&mut self, other: T)
 
fn mul_assign(&mut self, other: T)
*= operation. Read moreSource§impl<T: Clone + NumAssign> MulAssign for Complex<T>
 
impl<T: Clone + NumAssign> MulAssign for Complex<T>
Source§fn mul_assign(&mut self, other: Self)
 
fn mul_assign(&mut self, other: Self)
*= operation. Read moreSource§impl<T: Num + Clone> Num for Complex<T>
 
impl<T: Num + Clone> Num for Complex<T>
Source§fn from_str_radix(s: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr>
 
fn from_str_radix(s: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr>
Parses a +/- bi; ai +/- b; a; or bi where a and b are of type T
type FromStrRadixErr = ParseComplexError<<T as Num>::FromStrRadixErr>
Source§impl<'a, T: Clone + NumAssign> RemAssign<&'a Complex<T>> for Complex<T>
 
impl<'a, T: Clone + NumAssign> RemAssign<&'a Complex<T>> for Complex<T>
Source§fn rem_assign(&mut self, other: &Self)
 
fn rem_assign(&mut self, other: &Self)
%= operation. Read moreSource§impl<'a, T: Clone + NumAssign> RemAssign<&'a T> for Complex<T>
 
impl<'a, T: Clone + NumAssign> RemAssign<&'a T> for Complex<T>
Source§fn rem_assign(&mut self, other: &T)
 
fn rem_assign(&mut self, other: &T)
%= operation. Read moreSource§impl<T: Clone + NumAssign> RemAssign<T> for Complex<T>
 
impl<T: Clone + NumAssign> RemAssign<T> for Complex<T>
Source§fn rem_assign(&mut self, other: T)
 
fn rem_assign(&mut self, other: T)
%= operation. Read moreSource§impl<T: Clone + NumAssign> RemAssign for Complex<T>
 
impl<T: Clone + NumAssign> RemAssign for Complex<T>
Source§fn rem_assign(&mut self, other: Self)
 
fn rem_assign(&mut self, other: Self)
%= operation. Read moreSource§impl<'a, T: Clone + NumAssign> SubAssign<&'a Complex<T>> for Complex<T>
 
impl<'a, T: Clone + NumAssign> SubAssign<&'a Complex<T>> for Complex<T>
Source§fn sub_assign(&mut self, other: &Self)
 
fn sub_assign(&mut self, other: &Self)
-= operation. Read moreSource§impl<'a, T: Clone + NumAssign> SubAssign<&'a T> for Complex<T>
 
impl<'a, T: Clone + NumAssign> SubAssign<&'a T> for Complex<T>
Source§fn sub_assign(&mut self, other: &T)
 
fn sub_assign(&mut self, other: &T)
-= operation. Read moreSource§impl<T: Clone + NumAssign> SubAssign<T> for Complex<T>
 
impl<T: Clone + NumAssign> SubAssign<T> for Complex<T>
Source§fn sub_assign(&mut self, other: T)
 
fn sub_assign(&mut self, other: T)
-= operation. Read moreSource§impl<T: Clone + NumAssign> SubAssign for Complex<T>
 
impl<T: Clone + NumAssign> SubAssign for Complex<T>
Source§fn sub_assign(&mut self, other: Self)
 
fn sub_assign(&mut self, other: Self)
-= operation. Read moreSource§impl<T: ToPrimitive + Num> ToPrimitive for Complex<T>
 
impl<T: ToPrimitive + Num> ToPrimitive for Complex<T>
Source§fn to_usize(&self) -> Option<usize>
 
fn to_usize(&self) -> Option<usize>
self to a usize. If the value cannot be
represented by a usize, then None is returned.Source§fn to_isize(&self) -> Option<isize>
 
fn to_isize(&self) -> Option<isize>
self to an isize. If the value cannot be
represented by an isize, then None is returned.Source§fn to_u8(&self) -> Option<u8>
 
fn to_u8(&self) -> Option<u8>
self to a u8. If the value cannot be
represented by a u8, then None is returned.Source§fn to_u16(&self) -> Option<u16>
 
fn to_u16(&self) -> Option<u16>
self to a u16. If the value cannot be
represented by a u16, then None is returned.Source§fn to_u32(&self) -> Option<u32>
 
fn to_u32(&self) -> Option<u32>
self to a u32. If the value cannot be
represented by a u32, then None is returned.Source§fn to_u64(&self) -> Option<u64>
 
fn to_u64(&self) -> Option<u64>
self to a u64. If the value cannot be
represented by a u64, then None is returned.Source§fn to_i8(&self) -> Option<i8>
 
fn to_i8(&self) -> Option<i8>
self to an i8. If the value cannot be
represented by an i8, then None is returned.Source§fn to_i16(&self) -> Option<i16>
 
fn to_i16(&self) -> Option<i16>
self to an i16. If the value cannot be
represented by an i16, then None is returned.Source§fn to_i32(&self) -> Option<i32>
 
fn to_i32(&self) -> Option<i32>
self to an i32. If the value cannot be
represented by an i32, then None is returned.Source§fn to_i64(&self) -> Option<i64>
 
fn to_i64(&self) -> Option<i64>
self to an i64. If the value cannot be
represented by an i64, then None is returned.Source§fn to_u128(&self) -> Option<u128>
 
fn to_u128(&self) -> Option<u128>
self to a u128. If the value cannot be
represented by a u128 (u64 under the default implementation), then
None is returned. Read moreSource§fn to_i128(&self) -> Option<i128>
 
fn to_i128(&self) -> Option<i128>
self to an i128. If the value cannot be
represented by an i128 (i64 under the default implementation), then
None is returned. Read more