11个版本
0.1.10 | 2024年1月7日 |
---|---|
0.1.9 | 2023年1月28日 |
0.1.1 | 2022年12月31日 |
#159 在 算法
每月42次下载
165KB
4K SLoC
任意精度浮点库
ARPFloat是任意精度浮点数据结构和工具的实现。该库可以用来模拟现有的浮点类型,例如FP16,并创建新的浮点类型。浮点类型可以扩展到数百位,并进行非常精确的计算。在ARPFloat中,舍入模式是类型系统的一部分,这定义了解决fenv.h使用时出现的一些问题。
no_std
环境通过禁用std
特性得到支持。
示例
use arpfloat::Float;
use arpfloat::FP128;
// Create the number '5' in FP128 format.
let n = Float::from_f64(5.).cast(FP128);
// Use Newton-Raphson to find the square root of 5.
let mut x = n.clone();
for _ in 0..20 {
x += (&n / &x)/2;
}
println!("fp128: {}", x);
println!("fp64: {}", x.as_f64());
上述程序将输出以下内容
fp128: 2.2360679774997896964091736687312763
fp64: 2.23606797749979
该库还提供了API,可以公开舍入模式和底层操作。
use arpfloat::FP128;
use arpfloat::RoundingMode::NearestTiesToEven;
use arpfloat::Float;
let x = Float::from_u64(FP128, 1<<53);
let y = Float::from_f64(1000.0).cast(FP128);
let val = Float::mul_with_rm(&x, &y, NearestTiesToEven);
查看数字的内部表示
use arpfloat::Float;
use arpfloat::FP16;
let fp = Float::from_i64(FP16, 15);
fp.dump(); // Prints FP[+ E=+3 M=11110000000]
let m = fp.get_mantissa();
m.dump(); // Prints 11110000000
控制类型转换的舍入模式
use arpfloat::{FP16, FP32, RoundingMode, Float};
let x = Float::from_u64(FP32, 2649);
let b = x.cast_with_rm(FP16, RoundingMode::Zero);
println!("{}", b); // Prints 2648!
定义新的浮点格式并使用高精度超越函数
use arpfloat::{Float, Semantics};
// Define a new float format with 120 bits of accuracy, and
// dynamic range of 2^10.
let sem = Semantics::new(10, 120);
let pi = Float::pi(sem);
let x = Float::exp(&pi);
println!("e^pi = {}", x); // Prints 23.1406926327792....
浮点数可以转换为近似其值的连分数。
use arpfloat::{Float, FP256, RoundingMode};
let ln = Float::ln2(FP256);
println!("ln(2) = {}", ln);
for i in 1..20 {
let (p,q) = ln.as_fraction(i);
println!("{}/{}", p.as_decimal(), q.as_decimal());
}
上述程序将输出以下内容
ln(2) = .6931471805599453094172321214581765680755001343602552.....
0/1
1/1
2/3
7/10
9/13
61/88
192/277
253/365
445/642
1143/1649
1588/2291
2731/3940
....
在示例目录中包含了一些演示该库使用的程序。
资源
有许多优秀的资源,其中一些在代码中已引用
- 书籍
- 《浮点运算手册》第2010版,作者Jean-Michel Muller等。
- 《初等函数:算法与实现》,作者Jean-Michel Muller。
- 《现代计算机算术》,作者Brent和Zimmermann。
- 论文
- 《基于IEEE浮点标准的精确初等数学库》,作者Gal和Bachels。
- 《如何准确地打印浮点数》,作者Steele和White。
- 《每一位计算机科学家都应该了解的浮点运算》——大卫·戈德堡。
- 基础函数的高效多精度计算——理查德·布伦特。
- 任意精度数的快速三角函数——亨里克·韦斯特马克。
- 其他优秀的软件实现:APFloat、RYU、libBF、newlib、musl等。
许可证
Apache-2.0许可证下发布