11个版本

0.1.10 2024年1月7日
0.1.9 2023年1月28日
0.1.1 2022年12月31日

#159算法

每月42次下载

Apache-2.0

165KB
4K SLoC

任意精度浮点库  

Latest Version Docs Badge

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许可证下发布

无运行时依赖