pub trait Precision {
const MAX_DECIMAL: u32;
fn max_decimal(&self) -> u32;
fn max_10_exp(&self) -> i32;
fn min_10_exp(&self) -> i32;
#[must_use]
fn epsilon(&self) -> Self;
}
impl Precision for f32 {
const MAX_DECIMAL: u32 = 7;
fn max_decimal(&self) -> u32 {
f32::MAX_DECIMAL
}
fn max_10_exp(&self) -> i32 {
f32::MAX_10_EXP
}
fn min_10_exp(&self) -> i32 {
f32::MIN_10_EXP
}
fn epsilon(&self) -> Self {
f32::EPSILON
}
}
impl Precision for f64 {
const MAX_DECIMAL: u32 = 15;
fn max_decimal(&self) -> u32 {
f64::MAX_DECIMAL
}
fn max_10_exp(&self) -> i32 {
f64::MAX_10_EXP
}
fn min_10_exp(&self) -> i32 {
f64::MIN_10_EXP
}
fn epsilon(&self) -> Self {
f64::EPSILON
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn precision_f32() {
assert_eq!(f32::MAX_DECIMAL, 7_u32);
assert_eq!(0.0_f32.max_decimal(), f32::MAX_DECIMAL);
assert_eq!(0.0_f32.max_10_exp(), f32::MAX_10_EXP);
assert_eq!(0.0_f32.max_10_exp(), 38_i32);
assert_eq!(0.0_f32.min_10_exp(), f32::MIN_10_EXP);
assert_eq!(0.0_f32.min_10_exp(), -37_i32);
assert_eq!(0.0_f32.epsilon(), f32::EPSILON);
}
#[test]
fn precision_f64() {
assert_eq!(f64::MAX_DECIMAL, 15_u32);
assert_eq!(0.0_f64.max_decimal(), f64::MAX_DECIMAL);
assert_eq!(0.0_f64.max_10_exp(), f64::MAX_10_EXP);
assert_eq!(0.0_f64.max_10_exp(), 308_i32);
assert_eq!(0.0_f64.min_10_exp(), f64::MIN_10_EXP);
assert_eq!(0.0_f64.min_10_exp(), -307_i32);
assert_eq!(0.0_f64.epsilon(), f64::EPSILON);
}
}