2个版本
使用旧的 Rust 2015
0.1.1 | 2017年11月20日 |
---|---|
0.1.0 | 2017年5月17日 |
在#integer-arithmetic中排名17
21KB
383 行
修复
定点数类型。
文档
lib.rs
:
定点数类型。
是什么?
定点数是一种具有固定小数点前后的数字数量的数字表示方法。这意味着范围是静态的,而不是像浮点数那样的动态。这也意味着它们可以用整数表示,其缩放由类型系统跟踪。
在这个库中,Fix
的缩放由两个类型级别整数表示:基数和指数。任何底层整数原始类型都可以用来存储数字。可以对这些数字进行算术运算,并且可以将它们转换为不同的缩放指数。
为什么?
一个经典例子:让我们用浮点数计算10美分和20美分的总和。我们期望的结果是30美分。
assert_eq!(0.30, 0.10 + 0.20);
错误!我们得到了额外的四十万亿分之一美元。
assertion failed: `(left == right)` (left: `0.3`, right: `0.30000000000000004`)'
这是因为0.1和0.2都不能在二进制中精确表示,就像三分之一不能在十进制中精确表示一样。使用Fix
,我们可以在编译时选择想要的精度。在这种情况下,美元的百分之一就足够了。
use fix::aliases::si::Centi; // Fix<_, U10, N2>
assert_eq!(Centi::new(0_30), Centi::new(0_10) + Centi::new(0_20));
但是,十进制对二进制计算机来说效率不高,对吧?乘以或除以10比位操作慢,但只有在移动小数点时才需要。使用Fix
,这只需要通过convert
方法显式完成。
use fix::aliases::si::{Centi, Milli};
assert_eq!(Milli::new(0_300), Centi::new(0_30).convert());
我们也可以轻松选择二进制缩放。
use fix::aliases::iec::{Kibi, Mebi};
assert_eq!(Kibi::new(1024), Mebi::new(1).convert());
还值得注意的是,在乘法和除法操作中,类型级别的缩放会发生变化,从而避免了任何隐式转换。
use fix::aliases::iec::{Gibi, Kibi, Mebi};
assert_eq!(Mebi::new(3), Gibi::new(6) / Kibi::new(2));
no_std
这个crate是no_std
。
i128
支持
可以通过nightly Rust的i128
Cargo功能启用对u128
和i128
的支持。
依赖关系
~155KB