1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2017年4月1日 |
---|
#53 在 #fixed-point
304 每月下载量
用于 12 个 软件包(直接使用3个)
74KB
2K SLoC
fpa
定点算术
许可证
许可协议为以下之一
-
Apache License,版本2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
您可选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交的工作,均应以上述双许可方式授权,不得附加任何额外条款或条件。
lib.rs
:
定点算术
定点数是实数的另一种表示形式。IEEE浮点数,如f32
和f64
,是具有浮点单元(FPU)的处理器的标准格式。您应该在没有FPU且性能至关重要的系统上考虑使用定点数,因为定点算术比软件模拟的IEEE浮点算术更快。请注意,定点数由于操作范围远小于浮点数,因此更容易溢出。
本库中公开的定点数使用以下命名约定:IxFy
,其中x
表示用于整数部分的位数,y
表示用于分数部分的位数。
与IEEE浮点数不同,定点数的精度是固定的。可以通过选择不同的x
和y
值,在范围和精度之间进行交换。
- 范围:
[-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