10 个版本
| 0.5.3 | 2024年6月18日 |
|---|---|
| 0.5.2 | 2023年11月15日 |
| 0.5.1 | 2023年8月30日 |
| 0.2.2 | 2023年7月15日 |
| 0.1.0 | 2021年6月25日 |
#61 in 数学
9,316 每月下载量
用于 6 个 Crates(2 个直接使用)
96KB
2.5K SLoC
crate scientific
任意精度科学数字
常量
使用 Scientific! 创建常量数字。
use scientific::Scientific;
let n1 = Scientific!(1e100);
let n2 = Scientific!(1e80);
assert_eq!(&n1 + &n2, Scientific!(1.00000000000000000001e100));
// An f64 has only a precision of about 15.9 digits, this are already 21.
调用
所有函数都期望一个 Scientific 数字的引用。(见上面示例。)
转换
存在 From 和 TryFrom 特性,用于在 Scientific 和整数、浮点数和字符串之间进行转换。
将具有小数的科学数字转换为整数将失败。
存在一个 FromStr 实例(它克隆了 str 并调用 Scientific::from_string)。
函数 Scientific::to_bytes 和 Scientific::from_bytes 使用压缩表示而不是 ASCII(当使用 serde 与非人类可读格式时,也将使用此格式)。
精度
大多数函数在真正的任意精度下工作,请注意这一点。
例如:将 1e1000 和 1e-1000 相加,这两个数都只有 1 个字节的尾数,结果将会有 2001 个字节的尾数。
除法和平方根(依赖于除法)以及所有舍入函数都需要指定精度,结果将只计算到该精度。
可以指定为 Decimals 或 Digits。当使用小数时,指定计算的小数位数(例如,对于 0.01 的最小数值,使用 2,对于 1 使用 0,对于 100 使用 -2)。当使用数字时,指定尾数的位数(使用 <= 0 位数字将始终为零)。
快捷键:Precision::INTEGER 用于整数计算(即 Decimals(0))和 Precision::F64 用于具有更好精度的 f64 计算作为(即 Digits(16))。
位移
位移运算符通过一位(而不是您可能期望的一位)进行位移。
舍入
函数 round/round_assign 支持多种舍入选项。请参阅 Rounding。
上述函数应仅用于最终舍入。如果需要中间舍入(例如,以保持尾数易于管理)请使用 round_rpsp/round_assign,至少与最终精度相同。舍入将创建比您所需多一位的数字,以便轻松使用。RPSP 代表为较短精度舍入,请参阅 维基百科 获取更多信息。
在任何情况下,都建议使用 *_assign 版本,因为它可以节省尾数的重新分配(尽管不是每次都需要或可以避免)。
示例
let precision = Precision::Digits(30); // precision for intermediate roundings and the final one
// do calculations
value.round_rpsp_assign(precision); // round to 31 digits with 'Rounding to prepare for shorter precision'
// do more calculations
value.round_assign(precision, RoundHalfUp); // round to 30 digits with the method 'RoundHalfUp'
截断
函数 truncate/truncate_assign 与使用 RoundTowardsZero 的舍入相同,但更快。
此外,truncate_assign 也比 truncate 快,因为它不需要复制。无论如何,它都不需要移动尾数(因为尾数没有改变,只是可能引用了它的前缀)。
特性
-
serde:启用 serde 的 De-/序列化。 -
macro:重新导出Scientific!宏,默认启用。 -
std:如果启用,库需要std并且为所有错误类型实现了Error特性。如果没有它,库将是no_std。 -
arc:使用Arc而不是Rc,这可以为Scientific提供发送和同步特性。尽管Arc更昂贵,但由于它仅在创建/克隆/销毁Scientific数字时使用,因此可能并不那么昂贵。 -
debug:启用多个检查。在开发此库时非常有帮助。
指数
指数表示为 isize。预期它永远不会溢出或下溢,即使在添加或减去较小的数字时,例如尾数的长度。
这不会被检查!
依赖关系
~165KB