#hex #float #浮点数 #表示法 #语法 #解析 #hexfloat

hexfloat2

解析和格式化IEEE754浮点数十六进制语法

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

MIT 许可证

29KB
503

hexfloat2 支持十六进制 f32/64 语法。

IEEE754定义了一种“十六进制尾数字符序列”的语法,允许您精确地表示浮点数。

例如

  • 0x1.0p0 只是 1.0
  • 0x8.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>,也称为 HexFloat32HexFloat64,实现了 DisplayFromStr

如果您不想处理包装器结构体,也可以调用 hexfloat::parse::<T>()hexfloat::format::<T>()

无运行时依赖