#![allow(clippy::float_cmp)]
use float8::F8E4M3;
use microfloat::f8e4m3fn;
use std::num::FpCategory;
const fn e4m3_bits(sign: u8, exp: u8, mant: u8) -> u8 {
(sign << 7) | ((exp & 0xF) << 3) | (mant & 0x7)
}
#[test]
fn float8_f8e4m3_classify_zero() {
assert_eq!(F8E4M3::ZERO.classify(), FpCategory::Subnormal);
assert_eq!(F8E4M3::NEG_ZERO.classify(), FpCategory::Subnormal);
assert_eq!(f8e4m3fn::ZERO.classify(), FpCategory::Zero);
assert_eq!(f8e4m3fn::NEG_ZERO.classify(), FpCategory::Zero);
}
#[test]
fn float8_f8e4m3_classify_nan() {
assert_eq!(F8E4M3::NAN.classify(), FpCategory::Subnormal);
assert!(F8E4M3::NAN.is_nan());
assert!(!F8E4M3::NAN.is_finite());
assert!(!F8E4M3::NAN.is_normal());
assert_eq!(f8e4m3fn::NAN.classify(), FpCategory::Nan);
assert!(f8e4m3fn::NAN.is_nan());
}
#[test]
fn float8_f8e4m3_satfinite_infinity_constant() {
assert_eq!(F8E4M3::INFINITY.to_bits(), e4m3_bits(0b0, 0b1111, 0b110));
assert_eq!(F8E4M3::INFINITY.to_f32(), 448.0);
assert!(F8E4M3::INFINITY.is_infinite());
let inf = F8E4M3::from_bits(e4m3_bits(0b0, 0b1111, 0b110));
assert!(inf.is_infinite());
assert_eq!(inf.to_f32(), 448.0);
assert!(!f8e4m3fn::has_inf());
let val = f8e4m3fn::from_bits(e4m3_bits(0b0, 0b1111, 0b110));
assert_eq!(val.to_f32(), 448.0);
assert!(val.is_finite());
assert!(!val.is_infinite());
}
#[test]
fn float8_f8e4m3_max_448() {
let val = F8E4M3::from_f32(448.0);
assert_eq!(val.to_bits(), e4m3_bits(0b0, 0b1111, 0b110));
assert_eq!(val.to_bits(), F8E4M3::INFINITY.to_bits());
assert!(val.is_infinite());
assert_eq!(val.to_f32(), 448.0);
assert_eq!(f8e4m3fn::MAX.to_bits(), e4m3_bits(0b0, 0b1111, 0b110));
assert_eq!(f8e4m3fn::MAX.to_f32(), 448.0);
assert!(f8e4m3fn::MAX.is_finite());
assert!(!f8e4m3fn::MAX.is_infinite());
}
#[test]
fn float8_f8e4m3_overflow_to_nan() {
assert!(f8e4m3fn::from_f32(500.0).to_f32().is_nan());
assert!(f8e4m3fn::from_f32(f32::INFINITY).to_f32().is_nan());
assert!(f8e4m3fn::from_f32(f32::NEG_INFINITY).to_f32().is_nan());
}
#[test]
fn float8_f8e4m3_ieee_infinity_not_recognized() {
let ieee_inf = F8E4M3::from_bits(e4m3_bits(0b0, 0b1111, 0b000));
assert!(!ieee_inf.is_infinite());
assert_eq!(ieee_inf.to_f32(), 256.0);
let mf_val = f8e4m3fn::from_bits(e4m3_bits(0b0, 0b1111, 0b000));
assert_eq!(mf_val.to_f32(), 256.0);
assert!(mf_val.is_finite());
}