#![allow(clippy::float_cmp)]
use float8::F8E5M2;
use microfloat::f8e5m2;
use std::num::FpCategory;
const fn e5m2_bits(sign: u8, exp: u8, mant: u8) -> u8 {
(sign << 7) | ((exp & 0x1F) << 2) | (mant & 0x3)
}
#[test]
fn float8_f8e5m2_classify_zero() {
assert_eq!(F8E5M2::ZERO.classify(), FpCategory::Subnormal);
assert_eq!(F8E5M2::NEG_ZERO.classify(), FpCategory::Subnormal);
assert_eq!(f8e5m2::ZERO.classify(), FpCategory::Zero);
assert_eq!(f8e5m2::NEG_ZERO.classify(), FpCategory::Zero);
}
#[test]
fn float8_f8e5m2_classify_nan() {
assert_eq!(F8E5M2::NAN.classify(), FpCategory::Subnormal);
assert!(F8E5M2::NAN.is_nan());
assert!(!F8E5M2::NAN.is_finite());
assert!(!F8E5M2::NAN.is_normal());
assert_eq!(f8e5m2::NAN.classify(), FpCategory::Nan);
assert!(f8e5m2::NAN.is_nan());
}
#[test]
fn float8_f8e5m2_satfinite_infinity_constant() {
assert_eq!(F8E5M2::INFINITY.to_bits(), e5m2_bits(0b0, 0b11110, 0b11));
assert_eq!(F8E5M2::INFINITY.to_f32(), 57344.0);
assert!(F8E5M2::INFINITY.is_infinite());
let inf = F8E5M2::from_bits(e5m2_bits(0b0, 0b11110, 0b11));
assert!(inf.is_infinite());
assert_eq!(inf.to_f32(), 57344.0);
assert!(f8e5m2::has_inf());
assert_eq!(f8e5m2::INFINITY.to_bits(), e5m2_bits(0b0, 0b11111, 0b00));
assert!(f8e5m2::INFINITY.is_infinite());
assert!(f8e5m2::NEG_INFINITY.is_infinite());
}
#[test]
fn float8_f8e5m2_max_57344() {
assert_eq!(F8E5M2::MAX.to_bits(), e5m2_bits(0b0, 0b11110, 0b10));
assert_eq!(F8E5M2::MAX.to_f32(), 49152.0);
assert_eq!(F8E5M2::INFINITY.to_bits(), e5m2_bits(0b0, 0b11110, 0b11));
assert_eq!(F8E5M2::INFINITY.to_f32(), 57344.0);
assert_eq!(f8e5m2::MAX.to_bits(), e5m2_bits(0b0, 0b11110, 0b11));
assert_eq!(f8e5m2::MAX.to_f32(), 57344.0);
assert!(f8e5m2::MAX.is_finite());
assert!(!f8e5m2::MAX.is_infinite());
}
#[test]
fn float8_f8e5m2_ieee_infinity_not_recognized() {
let ieee_inf = F8E5M2::from_bits(e5m2_bits(0b0, 0b11111, 0b00));
assert!(!ieee_inf.is_infinite());
assert_eq!(ieee_inf.to_f32(), f32::INFINITY);
let mf_inf = f8e5m2::from_bits(e5m2_bits(0b0, 0b11111, 0b00));
assert!(mf_inf.is_infinite());
assert_eq!(f8e5m2::INFINITY.to_bits(), e5m2_bits(0b0, 0b11111, 0b00));
}