#![no_std]
#![cfg_attr(docsrs, feature(doc_cfg))]
mod bits;
mod format;
#[macro_use]
mod formats;
mod micro;
#[cfg(feature = "num-traits")]
mod num_traits_impl;
mod ops;
#[cfg(feature = "rand_distr")]
mod rand_distr;
#[cfg(feature = "serde")]
#[macro_use]
mod serde;
use crate::format::{Format, NanEncoding, Overflow, SignMode, ZeroMode};
use crate::micro::MicroFloat;
define_format!(
pub struct f8e3m4, Float8E3M4Format {
storage: 8,
exponent: 3,
mantissa: 4,
digits: 5,
bias: 3,
sign: Signed,
zero: Signed,
nan: NanEncoding::Ieee,
overflow: Infinity,
bits: {
neg_zero: 0x80,
one: 0x30,
neg_one: 0xb0,
min_positive_subnormal: 0x01,
max_subnormal: 0x0f,
min_positive: 0x10,
min: 0xef,
max: 0x6f,
epsilon: 0x31,
infinity: 0x70,
neg_infinity: 0xf0,
nan: 0x78
}
}
);
define_format!(
pub struct f8e4m3, Float8E4M3Format {
storage: 8,
exponent: 4,
mantissa: 3,
digits: 4,
bias: 7,
sign: Signed,
zero: Signed,
nan: NanEncoding::Ieee,
overflow: Infinity,
bits: {
neg_zero: 0x80,
one: 0x38,
neg_one: 0xb8,
min_positive_subnormal: 0x01,
max_subnormal: 0x07,
min_positive: 0x08,
min: 0xf7,
max: 0x77,
epsilon: 0x39,
infinity: 0x78,
neg_infinity: 0xf8,
nan: 0x7c
}
}
);
define_format!(
pub struct f8e4m3b11fnuz, Float8E4M3B11FnuzFormat {
storage: 8,
exponent: 4,
mantissa: 3,
digits: 4,
bias: 11,
sign: Signed,
zero: Unsigned,
nan: NanEncoding::Single(0x80),
overflow: Nan,
bits: {
neg_zero: 0x00,
one: 0x58,
neg_one: 0xd8,
min_positive_subnormal: 0x01,
max_subnormal: 0x07,
min_positive: 0x08,
min: 0xff,
max: 0x7f,
epsilon: 0x59,
infinity: 0x80,
neg_infinity: 0x80,
nan: 0x80
}
}
);
define_format!(
pub struct f8e4m3fn, Float8E4M3FnFormat {
storage: 8,
exponent: 4,
mantissa: 3,
digits: 4,
bias: 7,
sign: Signed,
zero: Signed,
nan: NanEncoding::Outer,
overflow: Nan,
bits: {
neg_zero: 0x80,
one: 0x38,
neg_one: 0xb8,
min_positive_subnormal: 0x01,
max_subnormal: 0x07,
min_positive: 0x08,
min: 0xfe,
max: 0x7e,
epsilon: 0x39,
infinity: 0x7f,
neg_infinity: 0xff,
nan: 0x7f
}
}
);
define_format!(
pub struct f8e4m3fnuz, Float8E4M3FnuzFormat {
storage: 8,
exponent: 4,
mantissa: 3,
digits: 4,
bias: 8,
sign: Signed,
zero: Unsigned,
nan: NanEncoding::Single(0x80),
overflow: Nan,
bits: {
neg_zero: 0x00,
one: 0x40,
neg_one: 0xc0,
min_positive_subnormal: 0x01,
max_subnormal: 0x07,
min_positive: 0x08,
min: 0xff,
max: 0x7f,
epsilon: 0x41,
infinity: 0x80,
neg_infinity: 0x80,
nan: 0x80
}
}
);
define_format!(
pub struct f8e5m2, Float8E5M2Format {
storage: 8,
exponent: 5,
mantissa: 2,
digits: 3,
bias: 15,
sign: Signed,
zero: Signed,
nan: NanEncoding::Ieee,
overflow: Infinity,
bits: {
neg_zero: 0x80,
one: 0x3c,
neg_one: 0xbc,
min_positive_subnormal: 0x01,
max_subnormal: 0x03,
min_positive: 0x04,
min: 0xfb,
max: 0x7b,
epsilon: 0x3d,
infinity: 0x7c,
neg_infinity: 0xfc,
nan: 0x7e
}
}
);
define_format!(
pub struct f8e5m2fnuz, Float8E5M2FnuzFormat {
storage: 8,
exponent: 5,
mantissa: 2,
digits: 3,
bias: 16,
sign: Signed,
zero: Unsigned,
nan: NanEncoding::Single(0x80),
overflow: Nan,
bits: {
neg_zero: 0x00,
one: 0x40,
neg_one: 0xc0,
min_positive_subnormal: 0x01,
max_subnormal: 0x03,
min_positive: 0x04,
min: 0xff,
max: 0x7f,
epsilon: 0x41,
infinity: 0x80,
neg_infinity: 0x80,
nan: 0x80
}
}
);
define_format!(
pub struct f8e8m0fnu, Float8E8M0FnuFormat {
storage: 8,
exponent: 8,
mantissa: 0,
digits: 1,
bias: 127,
sign: Unsigned,
zero: None,
nan: NanEncoding::Single(0xff),
overflow: Nan,
bits: {
neg_zero: 0xff,
one: 0x7f,
neg_one: 0xff,
min_positive_subnormal: 0x00,
max_subnormal: 0x00,
min_positive: 0x00,
min: 0x00,
max: 0xfe,
epsilon: 0x7f,
infinity: 0xff,
neg_infinity: 0xff,
nan: 0xff
}
}
);
define_format!(
pub struct f4e2m1fn, Float4E2M1FnFormat {
storage: 4,
exponent: 2,
mantissa: 1,
digits: 2,
bias: 1,
sign: Signed,
zero: Signed,
nan: NanEncoding::None,
overflow: Saturate,
bits: {
neg_zero: 0x08,
one: 0x02,
neg_one: 0x0a,
min_positive_subnormal: 0x01,
max_subnormal: 0x01,
min_positive: 0x02,
min: 0x0f,
max: 0x07,
epsilon: 0x03,
infinity: 0x07,
neg_infinity: 0x0f,
nan: 0x08
}
}
);
define_format!(
pub struct f6e2m3fn, Float6E2M3FnFormat {
storage: 6,
exponent: 2,
mantissa: 3,
digits: 4,
bias: 1,
sign: Signed,
zero: Signed,
nan: NanEncoding::None,
overflow: Saturate,
bits: {
neg_zero: 0x20,
one: 0x08,
neg_one: 0x28,
min_positive_subnormal: 0x01,
max_subnormal: 0x07,
min_positive: 0x08,
min: 0x3f,
max: 0x1f,
epsilon: 0x09,
infinity: 0x1f,
neg_infinity: 0x3f,
nan: 0x20
}
}
);
define_format!(
pub struct f6e3m2fn, Float6E3M2FnFormat {
storage: 6,
exponent: 3,
mantissa: 2,
digits: 3,
bias: 3,
sign: Signed,
zero: Signed,
nan: NanEncoding::None,
overflow: Saturate,
bits: {
neg_zero: 0x20,
one: 0x0c,
neg_one: 0x2c,
min_positive_subnormal: 0x01,
max_subnormal: 0x03,
min_positive: 0x04,
min: 0x3f,
max: 0x1f,
epsilon: 0x0d,
infinity: 0x1f,
neg_infinity: 0x3f,
nan: 0x20
}
}
);
#[cfg(feature = "serde")]
serde_impls!(
f8e3m4,
f8e4m3,
f8e4m3b11fnuz,
f8e4m3fn,
f8e4m3fnuz,
f8e5m2,
f8e5m2fnuz,
f8e8m0fnu,
f4e2m1fn,
f6e2m3fn,
f6e3m2fn,
);