#[cfg(feature = "half-crate")]
mod half_impls {
use crate::{DeviceRepr, ValidAsZeroBits};
unsafe impl DeviceRepr for half::f16 {}
unsafe impl ValidAsZeroBits for half::f16 {}
unsafe impl DeviceRepr for half::bf16 {}
unsafe impl ValidAsZeroBits for half::bf16 {}
}
#[cfg(feature = "f8-crate")]
mod f8_impls {
use crate::{DeviceRepr, ValidAsZeroBits};
unsafe impl DeviceRepr for float8::F8E4M3 {}
unsafe impl ValidAsZeroBits for float8::F8E4M3 {}
unsafe impl DeviceRepr for float8::F8E5M2 {}
unsafe impl ValidAsZeroBits for float8::F8E5M2 {}
}
#[cfg(all(test, feature = "half-crate"))]
mod half_tests {
use crate::{DeviceRepr, ValidAsZeroBits};
fn assert_device_repr<T: DeviceRepr>() {}
fn assert_valid_as_zero<T: ValidAsZeroBits>() {}
#[test]
fn half_types_implement_the_trio() {
assert_device_repr::<half::f16>();
assert_device_repr::<half::bf16>();
assert_valid_as_zero::<half::f16>();
assert_valid_as_zero::<half::bf16>();
}
#[test]
fn half_zero_bits_round_trip() {
let h: half::f16 = unsafe { core::mem::zeroed() };
assert_eq!(h.to_f32(), 0.0);
let b: half::bf16 = unsafe { core::mem::zeroed() };
assert_eq!(b.to_f32(), 0.0);
}
}
#[cfg(all(test, feature = "f8-crate"))]
mod f8_tests {
use crate::{DeviceRepr, ValidAsZeroBits};
fn assert_device_repr<T: DeviceRepr>() {}
fn assert_valid_as_zero<T: ValidAsZeroBits>() {}
#[test]
fn f8_types_implement_the_trio() {
assert_device_repr::<float8::F8E4M3>();
assert_device_repr::<float8::F8E5M2>();
assert_valid_as_zero::<float8::F8E4M3>();
assert_valid_as_zero::<float8::F8E5M2>();
}
#[test]
fn f8_zero_bits_round_trip() {
let a: float8::F8E4M3 = unsafe { core::mem::zeroed() };
assert_eq!(a.to_f32(), 0.0);
let b: float8::F8E5M2 = unsafe { core::mem::zeroed() };
assert_eq!(b.to_f32(), 0.0);
}
}