use std::ops::{Add, Div, Mul, Sub};
mod private {
pub trait Sealed {}
impl Sealed for f32 {}
impl Sealed for f64 {}
}
pub trait Float:
self::private::Sealed
+ Copy
+ Clone
+ PartialEq
+ PartialOrd
+ Add<Self, Output = Self>
+ Sub<Self, Output = Self>
+ Div<Self, Output = Self>
+ Mul<Self, Output = Self>
{
fn from_usize(v: usize) -> Self;
fn from_float<F: Float>(v: F) -> Self;
fn to_f64(self) -> f64;
fn infinity() -> Self;
fn max_value() -> Self;
fn sqrt(self) -> Self;
fn abs(self) -> Self;
}
impl Float for f32 {
fn from_usize(v: usize) -> f32 {
v as f32
}
fn from_float<F: Float>(v: F) -> f32 {
v.to_f64() as f32
}
fn to_f64(self) -> f64 {
self as f64
}
fn infinity() -> f32 {
f32::INFINITY
}
fn max_value() -> f32 {
f32::MAX
}
fn sqrt(self) -> f32 {
f32::sqrt(self)
}
fn abs(self) -> f32 {
f32::abs(self)
}
}
impl Float for f64 {
fn from_usize(v: usize) -> f64 {
v as f64
}
fn from_float<F: Float>(v: F) -> f64 {
v.to_f64()
}
fn to_f64(self) -> f64 {
self
}
fn infinity() -> f64 {
f64::INFINITY
}
fn max_value() -> f64 {
f64::MAX
}
fn sqrt(self) -> f64 {
f64::sqrt(self)
}
fn abs(self) -> f64 {
f64::abs(self)
}
}