Struct num_complex::Complex
source · #[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: T
Real portion of the complex number
im: T
Imaginary portion of the complex number
Implementations§
source§impl<T: Clone + Num> Complex<T>
impl<T: Clone + Num> Complex<T>
sourcepub fn i() -> Self
pub fn i() -> Self
Returns the imaginary unit.
See also Complex::I
.
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: Float> Complex<T>
impl<T: Float> Complex<T>
sourcepub fn cis(phase: T) -> Self
pub fn cis(phase: T) -> Self
Create a new Complex with a given phase: exp(i * phase)
.
See cis (mathematics).
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);
source§impl<T: Float + FloatConst> Complex<T>
impl<T: Float + FloatConst> Complex<T>
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<T: Float + FloatConst> ComplexFloat for Complex<T>
impl<T: Float + FloatConst> ComplexFloat for Complex<T>
source§fn abs(self) -> Self::Real
fn abs(self) -> Self::Real
source§fn recip(self) -> Self
fn recip(self) -> Self
1/x
. See also Complex::finv.source§fn l1_norm(&self) -> Self::Real
fn l1_norm(&self) -> Self::Real
|re| + |im|
– the Manhattan distance from the origin.source§fn is_infinite(self) -> bool
fn is_infinite(self) -> bool
true
if this value is positive infinity or negative infinity and
false otherwise.source§fn powc(self, exp: Complex<Self::Real>) -> Complex<Self::Real>
fn powc(self, exp: Complex<Self::Real>) -> Complex<Self::Real>
self
to a complex power.source§fn log(self, base: Self::Real) -> Self
fn log(self, base: Self::Real) -> Self
source§fn asin(self) -> Self
fn asin(self) -> Self
source§fn acos(self) -> Self
fn acos(self) -> Self
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) + b
source§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) + b
source§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
radix
must be <= 18; larger radix would include i and j as digits,
which cannot be supported.
The conversion returns an error if 18 <= radix <= 36; it panics if radix > 36.
The elements of T
are parsed using Num::from_str_radix
too, and errors
(or panics) from that are reflected here as well.
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, modulus: Self)
fn rem_assign(&mut self, modulus: 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 moreimpl<T: Copy> Copy for Complex<T>
impl<T: Eq> Eq for Complex<T>
impl<T> StructuralPartialEq for Complex<T>
Auto Trait Implementations§
impl<T> Freeze for Complex<T>where
T: Freeze,
impl<T> RefUnwindSafe for Complex<T>where
T: RefUnwindSafe,
impl<T> Send for Complex<T>where
T: Send,
impl<T> Sync for Complex<T>where
T: Sync,
impl<T> Unpin for Complex<T>where
T: Unpin,
impl<T> UnwindSafe for Complex<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)