#precision #arbitrary #no-std #debugging

no-std scientific

任意精度科学数字(支持 no_std,纯 Rust 实现)

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 数学

Download history 945/week @ 2024-04-23 973/week @ 2024-04-30 866/week @ 2024-05-07 1854/week @ 2024-05-14 2114/week @ 2024-05-21 2028/week @ 2024-05-28 1564/week @ 2024-06-04 1866/week @ 2024-06-11 2103/week @ 2024-06-18 1962/week @ 2024-06-25 2074/week @ 2024-07-02 2848/week @ 2024-07-09 2325/week @ 2024-07-16 2337/week @ 2024-07-23 2118/week @ 2024-07-30 2098/week @ 2024-08-06

9,316 每月下载量
用于 6 Crates(2 个直接使用)

MIT 许可证

96KB
2.5K SLoC

Codecov Dependency status crates.io Downloads Github stars License

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 数字的引用。(见上面示例。)

转换

存在 FromTryFrom 特性,用于在 Scientific 和整数、浮点数和字符串之间进行转换。

将具有小数的科学数字转换为整数将失败。

存在一个 FromStr 实例(它克隆了 str 并调用 Scientific::from_string)。

函数 Scientific::to_bytesScientific::from_bytes 使用压缩表示而不是 ASCII(当使用 serde 与非人类可读格式时,也将使用此格式)。

精度

大多数函数在真正的任意精度下工作,请注意这一点。

例如:将 1e1000 和 1e-1000 相加,这两个数都只有 1 个字节的尾数,结果将会有 2001 个字节的尾数。

除法和平方根(依赖于除法)以及所有舍入函数都需要指定精度,结果将只计算到该精度。

可以指定为 DecimalsDigits。当使用小数时,指定计算的小数位数(例如,对于 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