#ieee-754 #decimal-number #decimal #serialization

无std decstr

IEEE 754十进制浮点比特串

5个版本

0.2.0 2023年6月13日
0.1.3 2023年4月16日
0.1.2 2023年4月15日
0.1.1 2023年4月15日
0.1.0 2023年4月15日

#1294 in 编码


用于 2 个crates (通过 numera)

Apache-2.0 OR MIT

280KB
6K SLoC

decstr: IEEE 754十进制比特串

decstr Latest version Documentation Latest

此库实现了一个纯Rust中的IEEE 754十进制浮点兼容编码。它旨在以一致和可移植的方式支持任意精度数字的交换和存储。

此库不实现十进制算术。它仅支持转换。

源代码编写得可供任何对了解IEEE 754十进制浮点标准感兴趣的人探索,并可由任何希望根据自己的需求修改实现部分的人修改。

入门

decstr 添加到您的 Cargo.toml

[dependencies.decstr]
version = "0.2.0"

任何Rust原始数值类型都可以编码为 Bitstring

let decimal = decstr::Bitstring::from(123.44);

// 123.44
println!("{}", decimal);

// [196, 73, 48, 34]
println!("{:?}", decimal.as_le_bytes());

Bitstring 类型选择可以容纳给定值的最小编码大小

let small = decstr::Bitstring::from(1u8);
let large = decstr::Bitstring::from(u128::MAX);

assert_eq!(4, small.as_le_bytes().len());
assert_eq!(20, large.as_le_bytes().len());

当启用 arbitrary-precision 功能时,可以编码任何大小的十进制数字

let decimal = decstr::BigBitstring::try_parse_str(include_str!("pi-to-500-places.txt"))?;

// 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912
println!("{}", decimal);

// [156, 105, 19, 152, 15, 187, 139, 242, 164, 92, 245, 58, 83, 59, 247, 116, 121, 126, 147, 145, 13, 115, 25, 41, 100, 249, 132, 181, 11, 238, 17, 99, 148, 216, 54, 191, 214, 107, 195, 233, 133, 53, 7, 78, 52, 218, 108, 77, 33, 46, 82, 27, 225, 16, 21, 83, 204, 18, 128, 13, 89, 61, 111, 163, 173, 241, 36, 216, 170, 74, 122, 232, 32, 141, 147, 29, 99, 27, 51, 216, 128, 99, 41, 223, 41, 156, 146, 96, 58, 120, 185, 181, 64, 182, 140, 69, 180, 65, 131, 113, 58, 115, 77, 46, 167, 154, 128, 114, 170, 101, 120, 227, 215, 18, 185, 77, 75, 76, 220, 174, 230, 238, 241, 128, 144, 250, 224, 176, 227, 135, 90, 137, 201, 110, 181, 144, 112, 181, 11, 92, 16, 162, 80, 124, 36, 46, 114, 196, 76, 173, 242, 140, 132, 69, 183, 96, 42, 151, 56, 217, 48, 161, 22, 181, 11, 20, 121, 111, 120, 68, 180, 170, 216, 16, 91, 127, 128, 140, 50, 208, 139, 195, 148, 165, 150, 123, 168, 10, 105, 239, 191, 89, 158, 161, 83, 220, 156, 134, 27, 89, 76, 143, 246, 59, 118, 101, 101, 67, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34]
println!("{:?}", decimal.as_le_bytes());

状态

此库相当新。它功能正常,但未优化,可能包含错误。

IEEE 754

如果您曾经使用过Rust的 f64、C#的 double 或JavaScript的 Number,您就已经在使用IEEE 754二进制(基数2)浮点的实现。该标准的最新版本也指定了十进制(基数10)浮点格式。它们并不像二进制格式那样普遍,但本身也很有趣。

如果您无法访问IEEE 754标准的副本,您可以查看兼容IEEE 754的开放标准通用十进制算术。它。

依赖关系

~190KB