开发者生态
morning
Beeg 浮动库,Fabrice Bellard 的 libbf 的 Rust 端口
2026-07-05
1 阅读
约8分钟阅读
serialx
字号:
🥩 libbeef Fabrice Bellard 的 libbf 的 Rust 翻译——一个微小的任意精度浮点库。这个名字代表“Beeg Float”。完整的 IEEE 754 语义:有符号零、NaN、无穷大、可配置指数宽度、次正规、所有五种舍入模式、所有五种状态标志。超越函数:exp、log、pow、sin、cos、tan、atan、atan2、asin、acos。具有独立的以 10 为底算术的十进制浮点 ( BigDecimal )。 no_std 兼容(需要 alloc )。零依赖的纯 Rust。快速示例使用 libbeef::format::formats ;使用 libbeef :: Float ;类型 Quad = Float < 格式 :: Binary128 > ; fn main ( ) { 让 a : Quad = "3.14159265358979323846" .解析()。展开 ( ) ;让 b : Quad = "2.71828182845904523536" 。解析()。展开 ( ) ;让结果 = (a * b) 。罪 ( ) ;打印! ( “{结果}” ) ; // 0.773942685266708278263054855332479932... } Float 将一个值与编译时格式配对,因此 * 和 .sin() 使用 128 位精度并自动舍入到最近的偶数 — 每个调用站点都没有格式参数。性能 libbeef 实现与 C libbf 相同的算法:基于 NTT 的乘法、除法/平方的牛顿迭代以及超越的 AGM/二进制分割。渐近复杂度对于每个操作类都是最优的: 操作类 复杂度 算法 add、sub、cmp O(n) 线性扫描 mul O(n log n) 数论变换 div、sqrt O(M(n)) NTT mul exp、log、sin、... 上的牛顿迭代 O(M(n) · log n) AGM / 二进制分裂 根据经验(完整数据在 docs/benchmark-report.md 中),libbeef 跟踪C libbf 的吞吐量以及来自 Rust 边界检查和分配模型的常数因子开销: op 256 位 30 000 位 300 000 位 vs libbf vs rug (GMP/MPFR) mul 6.7 84 100 ns/limb 1.3–2.0× 0.9–1.3× div 17.3 515 659 ns/limb 1.1–1.4× 2.6–3.5× sqrt 38.3 384 597 ns/limb 1.2–1.3× 3.2–4.3× sin 1051 — — ns/limb 0.7×(更快) 3.6× mul 行信息量最大:二次算法将显示操作数大小每十年约增长 10 倍(47 → 469 → 4688 个肢体),但 libbeef 增长了 4.2× 然后 1.2× — O(n log n) NTT 信封,与 C 原始形状相同。在 300k 位时,libbeef 约为 libbf 的 2 倍和 GMP 的 1.3 倍,同时比 num-bigint 的教科书/Toom 乘法快 4 倍。对于超越数,libbeef 在 sin/cos/tan/pow 上匹配或击败 C libbf,并且在 log/atan 上误差在 15% 以内。与 MPFR 的统一 3–5× 差距是算法性的(MPFR 对这些函数使用不同的、更好的算法;C libbf 显示了相同的差距)。除法和 sqrt 与 GMP/MPFR 相比显示出更大的常数因子差距 (~3×)。这是 libbf 的牛顿倒数方法与 GMP 的调整分而治之方法的固有属性 - 相同的比率出现在 C 原始版本中。为什么是libbeef? 1.纯Rust,无系统依赖。 rug/GMP 需要 C 编译器、系统 GMP/MPFR 库以及探测主机的构建脚本。 libbeef 是一个单一的货物添加,没有 build.rs , -lm ,也没有 pkg-config 。它建立在任何目标 rustc 支持之上——包括 WASM、嵌入式和交叉编译——零配置。 2. 二进制占用空间小。通过静态链接 GMP/MPFR,一个将两个数字相乘并计算 sin 的简单程序会产生: 库 二进制大小(剥离)libbeef 482 KiB num-bigint(仅整数,无三角函数) 448 KiB malachite(仅整数,无三角函数) 658 KiB rug(GMP + MPFR 静态链接) 680 KiB libbeef 提供完整的浮点算术和超越数比单独使用整数所需的孔雀石或地毯更少的空间。 num-bigint 二进制文件较小,只是因为它根本无法计算 sin——它没有浮点层。 3.正确、完整。 libbeef 在每个操作、精度和舍入模式中都通过了 libbf 自己的验证套件。它不是一个“足够好”的近似库——它实现了 IEEE 754 正确舍入的算术,具有可配置的指数宽度和次正规数。 4. no_std 准备就绪。只需要 alloc 。没有文件 I/O、没有线程、没有分配之外的系统调用。 5.更宽松的许可。 libbeef 是 MIT 许可的,而 GMP/MPFR 是 LGPL。这使得 libbeef 成为不希望对 LGPL 进行额外法律审查的许可证敏感项目的更好选择。何时使用其他东西 大精度(>10k 位)下的最大吞吐量:GMP/MPFR(通过 rug)具有经过严格调整的 FFT 和 Toom-Cook 堆栈,乘法常数约为 2-3 倍,除法常数约为 3 倍。如果百万位精度的原始 ns/op 是瓶颈,请使用 rug。仅整数工作负载:如果您从不需要浮点、舍入或超越数,num-bigint 或 malachite 可为您提供纯粹专注于整数的更简单的 API。大规模的十进制算术:libbeef 的十进制路径可以正常运行,但尚未进行性能调整(它通过二进制转换而不是本机的 base-10⁹ 内核进行路由)。构建和测试Cargo build #构建(默认功能:std)Cargo Test#运行所有测试Cargo test --test bftest#libbf验证套件(快速,单种子)Cargo Doc --open#生成并查看AP
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱