use super::{FloatElement, NumericElement};
use core::ops::{Add, Div, Mul, Neg, Sub};
pub trait RealField: FloatElement + PartialOrd + Neg<Output = Self> {
const PI: Self;
const TAU: Self;
const FRAC_PI_2: Self;
const E: Self;
const LN_2: Self;
const SQRT_2: Self;
const EPSILON: Self;
#[inline]
fn infinity() -> Self {
<Self as NumericElement>::INFINITY
}
#[inline]
fn neg_infinity() -> Self {
-<Self as NumericElement>::INFINITY
}
#[inline]
fn nan() -> Self {
<Self as NumericElement>::NAN
}
#[inline]
fn min_value() -> Self {
<Self as NumericElement>::MIN_VALUE
}
#[inline]
fn max_value() -> Self {
<Self as NumericElement>::MAX_VALUE
}
fn copysign(self, sign: Self) -> Self;
fn is_sign_positive(self) -> bool;
#[inline]
fn is_sign_negative(self) -> bool {
!self.is_sign_positive()
}
#[inline]
fn clamp(self, min: Self, max: Self) -> Self {
self.max_scalar(min).min_scalar(max)
}
#[inline]
fn to_radians(self) -> Self {
self * (Self::PI / Self::from_f64(180.0))
}
#[inline]
fn to_degrees(self) -> Self {
self * (Self::from_f64(180.0) / Self::PI)
}
}
pub trait ComplexField:
Copy
+ Add<Output = Self>
+ Sub<Output = Self>
+ Mul<Output = Self>
+ Div<Output = Self>
+ Neg<Output = Self>
{
type RealPart: RealField;
fn from_real(re: Self::RealPart) -> Self;
fn real(self) -> Self::RealPart;
fn imaginary(self) -> Self::RealPart;
fn modulus(self) -> Self::RealPart;
fn modulus_squared(self) -> Self::RealPart;
fn argument(self) -> Self::RealPart;
fn conjugate(self) -> Self;
fn scale(self, factor: Self::RealPart) -> Self;
fn sqrt(self) -> Self;
fn exp(self) -> Self;
fn ln(self) -> Self;
fn powf(self, n: Self::RealPart) -> Self;
fn sin(self) -> Self;
fn cos(self) -> Self;
#[inline]
#[must_use]
fn zero() -> Self {
Self::from_real(<Self::RealPart as NumericElement>::ZERO)
}
#[inline]
#[must_use]
fn one() -> Self {
Self::from_real(<Self::RealPart as NumericElement>::ONE)
}
}