4个版本
0.1.3 | 2023年12月2日 |
---|---|
0.1.2 | 2023年11月30日 |
0.1.1 | 2023年11月30日 |
0.1.0 | 2023年11月30日 |
#1301 在 解析器实现
用于 3 crates
29KB
503 行
hexfloat2
支持十六进制 f32/64 语法。
IEEE754定义了一种“十六进制尾数字符序列”的语法,允许您精确地表示浮点数。
例如
0x1.0p0
只是 1.00x8.8p1
是 8.5 * 2^1,或 17。0x3.0p-12
是 3 * 2^-12,或十进制中的 0.000732421875。
与十进制表示不同,“hexfloat”表示不涉及任何舍入,因此格式化后解析的往返行程将始终返回原始值。
格式化的十六进制浮点数将始终以其“规范”格式出现,尽可能接近地复制确切的位表示。例如,值 2^-20 将始终呈现为 0x1.0p-19
。
解析器尝试处理“非规范”表示。例如,这些值都将被解析为 2^-20
0x1.0p-20
0x2.0p-21
0x0.0008p-7
某些输入无法解析:具有过多十六进制数字的值(例如 0x10000000000000000p20
)将无法解析,因为解析器只愿意解析最多16个十六进制数字。超出底层类型(f32或f64)可以表示的范围的值也将无法解析。
具有过多精度的值将丢弃尾部位。例如,0x1.0000000000001p0
在解析到 HexFloat<f32>
时将被截断为 1.0
(但可以放入f64中)。
“非正常”值可以成功格式化和解析;0x0.000002p-127
可以解析为f32;更小的值将被截断为0。
示例
use hexfloat2::HexFloat32;
const EXPECTED: f32 = 1.0 / 1048576.0;
let x = "0x1.0p-20";
let fx: HexFloat32 = x.parse().unwrap();
assert_eq!(*fx, EXPECTED);
let y = "0x2.0p-21";
let fy: HexFloat32 = y.parse().unwrap();
assert_eq!(*fy, EXPECTED);
let z = "0x0.0008p-7";
let fz: HexFloat32 = z.parse().unwrap();
assert_eq!(*fz, EXPECTED);
let sz = format!("{fz}");
assert_eq!(sz, "0x1.000000p-20");
此包提供新类型包装器 HexFloat<T>
,也称为 HexFloat32
或 HexFloat64
,实现了 Display
和 FromStr
。
如果您不想处理包装器结构体,也可以调用 hexfloat::parse::<T>()
或 hexfloat::format::<T>()
。