use core::fmt::Debug;
use core::iter::Sum;
use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
pub trait Float:
Copy
+ Clone
+ Default
+ Debug
+ PartialEq
+ PartialOrd
+ Send
+ Sync
+ Sum
+ Add<Output = Self>
+ AddAssign
+ Sub<Output = Self>
+ SubAssign
+ Mul<Output = Self>
+ MulAssign
+ Div<Output = Self>
+ DivAssign
+ Neg<Output = Self>
+ 'static
{
fn zero() -> Self;
fn one() -> Self;
fn from_f64(value: f64) -> Self;
fn to_f64(self) -> f64;
fn sqrt(self) -> Self;
fn abs(self) -> Self;
fn is_finite(self) -> bool;
}
impl Float for f32 {
#[inline]
fn zero() -> Self {
0.0
}
#[inline]
fn one() -> Self {
1.0
}
#[inline]
fn from_f64(value: f64) -> Self {
value as f32
}
#[inline]
fn to_f64(self) -> f64 {
self as f64
}
#[inline]
fn sqrt(self) -> Self {
f32::sqrt(self)
}
#[inline]
fn abs(self) -> Self {
f32::abs(self)
}
#[inline]
fn is_finite(self) -> bool {
f32::is_finite(self)
}
}
impl Float for f64 {
#[inline]
fn zero() -> Self {
0.0
}
#[inline]
fn one() -> Self {
1.0
}
#[inline]
fn from_f64(value: f64) -> Self {
value
}
#[inline]
fn to_f64(self) -> f64 {
self
}
#[inline]
fn sqrt(self) -> Self {
f64::sqrt(self)
}
#[inline]
fn abs(self) -> Self {
f64::abs(self)
}
#[inline]
fn is_finite(self) -> bool {
f64::is_finite(self)
}
}