1个不稳定版本

使用旧的Rust 2015

0.1.0 2017年4月1日

#53#fixed-point

Download history 83/week @ 2024-04-06 153/week @ 2024-04-13 136/week @ 2024-04-20 104/week @ 2024-04-27 111/week @ 2024-05-04 106/week @ 2024-05-11 104/week @ 2024-05-18 97/week @ 2024-05-25 107/week @ 2024-06-01 59/week @ 2024-06-08 88/week @ 2024-06-15 96/week @ 2024-06-22 30/week @ 2024-06-29 36/week @ 2024-07-06 135/week @ 2024-07-13 93/week @ 2024-07-20

304 每月下载量
用于 12 软件包(直接使用3个)

MIT/Apache

74KB
2K SLoC

fpa

定点算术

许可证

许可协议为以下之一

您可选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交的工作,均应以上述双许可方式授权,不得附加任何额外条款或条件。


lib.rs:

定点算术

定点数是实数的另一种表示形式。IEEE浮点数,如f32f64,是具有浮点单元(FPU)的处理器的标准格式。您应该在没有FPU且性能至关重要的系统上考虑使用定点数,因为定点算术比软件模拟的IEEE浮点算术更快。请注意,定点数由于操作范围远小于浮点数,因此更容易溢出。

本库中公开的定点数使用以下命名约定:IxFy,其中x表示用于整数部分的位数,y表示用于分数部分的位数。

与IEEE浮点数不同,定点数的精度是固定的。可以通过选择不同的xy值,在范围和精度之间进行交换。

  • 范围: [-2 ^ (y - 1), 2 ^ (y - 1) - 2 ^ (-x)]
  • 精度: 2 ^ (-x)

例如,类型 I1F7 的范围是 [-1, 0.9921875],精度为 0.0078125

示例

  • 类型转换
// https://crates.io/crates/cast
extern crate cast;
extern crate fpa;

use cast::f64;
// 32-bit fixed point number, 16 bits for the integer part and 16 bits for
// the fractional part
use fpa::I16F16;

fn main() {
    // casts an integer into a fixed point number (infallible)
    let q = I16F16(1i8);

    // casts the fixed point number into a float (infallible)
    let f = f64(q);

    assert_eq!(f, 1.);
}
  • 算术运算
use fpa::I16F16;

// NOTE the `f64` -> `I16F16` cast is fallible because of NaN and infinity
assert_eq!(I16F16(1.25_f64).unwrap() + I16F16(2.75_f64).unwrap(),
           I16F16(4_f64).unwrap());

assert_eq!(I16F16(2_f64).unwrap() / I16F16(0.5_f64).unwrap(),
           I16F16(4_f64).unwrap());

assert_eq!(I16F16(2_f64).unwrap() * I16F16(0.5_f64).unwrap(),
           I16F16(1_f64).unwrap());
  • 三角函数
extern crate cast;
extern crate fpa;

use cast::f64;
use fpa::I2F30;

fn main() {
    let (r, _) = I2F30(0.3_f64).unwrap().polar(I2F30(0.4_f64).unwrap());
    assert!((f64(r) - 0.5).abs() < 1e-5);
}

依赖项

~195KB