Beeg浮点库,Fabrice Bellard的libbf的Rust移植
Fabrice Bellard的libbf的Rust翻译——一个小型任意精度浮点库。名称代表"Beeg Float"。完整的IEEE 754语义:带符号的零、NaN、无穷大、可配置的指数宽度、次正常数、所有五种舍入模式、所有五个状态标志。超越函数:exp、log、pow、sin、cos、tan、atan、atan2、asin、acos。独立的十进制浮点(BigDecimal)算术。兼容no_std(需要alloc)。纯Rust,没有依赖。快速示例使用libbeef::format::formats;使用libbeef::Float;类型Quad = Float<formats::Binary128>;fn main() {let a: Quad = "3.14159265358979323846".parse().unwrap(); let b: Quad = "2.71828182845904523536".parse().unwrap(); let result = (a * b).sin(); println!("{result}"); // 0.773942685266708278263054855332479932... } Float<F>将值与编译时格式配对,因此*和.sin()自动使用128位精度和四舍五入到最近的偶数——每个调用位置没有格式参数。性能libbeef实现了与C libbf相同的算法:基于NTT的乘法,牛顿迭代用于除法/sqrt,以及AGM/二分法用于超越函数。每个操作类的渐近复杂性是最优的:操作类复杂性算法加法、减法、比较 O(n) 线性扫描乘法 O(n log n) 数论变换除法、平方根 O(M(n)) 牛顿迭代通过NTT乘法 exp、log、sin等 O(M(n) · log n) AGM/二分法经验上(详细数据见docs/benchmark-report.md),libbeef跟踪C libbf的吞吐量,但由于Rust的边界检查和分配模型而产生常数因子的开销:操作256位30,000位300,000位vs libbf vs rug(GMP/MPFR)乘法6.7 84 100 ns/limb 1.3–2.0× 0.9–1.3×除法17.3 515 659 ns/limb 1.1–1.4× 2.6–3.5×平方根38.3 384 597 ns/limb 1.2–1.3× 3.2–4.3×正弦1051 — — ns/limb 0.7×(更快)3.6×乘法行是信息量最大的:一个二次算法将在每个操作数大小的十年中显示大约10倍的增长(47 → 469 → 4688 limbs),但libbeef则增长4.2×然后1.2×——O(n log n) NTT围档,与C原版形状相同。在30万位上,libbeef大约是libbf的2倍,是GMP的1.3倍,同时比num-bigint的传统乘法快4倍。对于超越函数,libbeef在sin/cos/tan/pow上与C libbf匹配或超越,在log/atan上保持在15%以内。到MPFR的统一3-5倍差距是算法性的(MPFR使用不同、更好的算法来处理这些函数;C libbf显示相同的差距)。除法和平方根显示出相较于GMP/MPFR的更大常数因子差距(大约3倍)。这是libbf的牛顿倒数方法与GMP调优的分而治之方法的固有特性——相同的比率出现在C原版中。为什么选择libbeef?1. 纯Rust,没有系统依赖。rug/GMP需要C编译器、系统GMP/MPFR库以及可以探测主机的build脚本。libbeef只需安装一次cargo add,不需要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在比malachite或rug处理整数所需空间更小的空间内提供完整的浮点运算和超越函数。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 # 生成并查看API文档
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡