#![allow(dead_code)] // FIXME(f16_f128): remove once constants are used // We run out of precision pretty quickly with f16 const F16_APPROX_L1: f16 = 0.001; const F16_APPROX_L2: f16 = 0.01; const F16_APPROX_L3: f16 = 0.1; const F16_APPROX_L4: f16 = 0.5; /// Smallest number const TINY_BITS: u16 = 0x1; /// Next smallest number const TINY_UP_BITS: u16 = 0x2; /// Exponent = 0b11...10, Sifnificand 0b1111..10. Min val > 0 const MAX_DOWN_BITS: u16 = 0x7bfe; /// Zeroed exponent, full significant const LARGEST_SUBNORMAL_BITS: u16 = 0x03ff; /// Exponent = 0b1, zeroed significand const SMALLEST_NORMAL_BITS: u16 = 0x0400; /// First pattern over the mantissa const NAN_MASK1: u16 = 0x02aa; /// Second pattern over the mantissa const NAN_MASK2: u16 = 0x0155; /// Compare by value #[allow(unused_macros)] macro_rules! assert_f16_eq { ($a:expr, $b:expr) => { let (l, r): (&f16, &f16) = (&$a, &$b); assert_eq!(*l, *r, "\na: {:#018x}\nb: {:#018x}", l.to_bits(), r.to_bits()) }; } /// Compare by representation #[allow(unused_macros)] macro_rules! assert_f16_biteq { ($a:expr, $b:expr) => { let (l, r): (&f16, &f16) = (&$a, &$b); let lb = l.to_bits(); let rb = r.to_bits(); assert_eq!( lb, rb, "float {:?} is not bitequal to {:?}.\na: {:#018x}\nb: {:#018x}", *l, *r, lb, rb ); }; }