50个版本 (稳定版)
| 1.25.0 | 2024年7月18日 |
|---|---|
| 1.24.1 | 2024年3月31日 |
| 1.24.0 | 2024年1月25日 |
| 1.22.0 | 2023年9月11日 |
| 0.5.0 | 2017年6月27日 |
#13 in 数学
11,080 每月下载次数
用于 170 个Crate(130直接使用)
2MB
33K SLoC
任意精度数字
Rug提供具有任意精度和正确舍入的整数和浮点数
Integer是一个任意精度的bignum整数,Rational是一个任意精度的bignum有理数,Float是一个具有正确舍入的多精度浮点数,并且Complex是一个具有正确舍入的多精度复数。
Rug是以下GNU库的高级接口
Rug是免费软件:您可以在自由软件基金会发布的GNU较小于通用公共许可证(LGPL)的条款下重新分发和/或修改它,许可证版本为3,或者(根据您的选择)任何更高版本。有关GNU LGPL和GNU GPL的完整文本,请参阅详细信息。
有什么新内容
版本1.25.0新闻(2024-07-18)
其他版本
其他版本的详细信息可以在RELEASES.md中找到。
快速示例
use rug::{Assign, Integer};
let mut int = Integer::new();
assert_eq!(int, 0);
int.assign(14);
assert_eq!(int, 14);
let decimal = "98_765_432_109_876_543_210";
int.assign(Integer::parse(decimal).unwrap());
assert!(int > 100_000_000);
let hex_160 = "ffff0000ffff0000ffff0000ffff0000ffff0000";
int.assign(Integer::parse_radix(hex_160, 16).unwrap());
assert_eq!(int.significant_bits(), 160);
int = (int >> 128) - 1;
assert_eq!(int, 0xfffe_ffff_u32);
Integer::new创建一个新的初始化为零的Integer整型。- 要分配值给Rug类型,我们使用
Assign特性和它的方法Assign::assign。我们不使用赋值运算符=,因为这会将左操作数丢弃并用相同类型的右操作数替换,这不是我们想要的。 - 任意精度数字可以存储不能适合原始类型的数字。要将此类数字分配给大类型,我们使用字符串而不是原始类型;在示例中,这使用
Integer::parse和Integer::parse_radix来完成。 - 我们可以使用正常比较运算符将Rug类型与原始类型或其他Rug类型进行比较,例如
int > 100_000_000。 - 大多数算术运算都支持在操作符两侧使用Rug类型和原始类型,例如
int >> 128。
与原始类型一起使用
与Rust原始类型一起使用时,算术运算符通常在相同类型的两个值上操作,例如12i32 + 5i32。与原始类型不同,Rug类型之间的转换和转换可能很昂贵,因此算术运算符被重载以在许多Rug类型和原始类型的组合上工作。更多详细信息请参阅文档。
运算符
操作符被重载以单独作用于Rug类型或Rug类型与Rust原始类型的组合。当至少有一个操作数是Rug类型的所有者值时,操作将消耗该值并返回Rug类型的值。例如:
use rug::Integer;
let a = Integer::from(10);
let b = 5 - a;
assert_eq!(b, 5 - 10);
在这里,a被减法消耗,而b是一个所有者Integer。
另一方面,如果没有所有者Rug类型,而是有引用,返回的值不是最终值,而是一个不完整的计算值。例如:
use rug::Integer;
let (a, b) = (Integer::from(10), Integer::from(20));
let incomplete = &a - &b;
// This would fail to compile: assert_eq!(incomplete, -10);
let sub = Integer::from(incomplete);
assert_eq!(sub, -10);
在这里,a和b没有被消耗,而incomplete不是最终值。它仍然需要转换或分配到一个Integer中。这在本文档的不完整计算值部分有更详细的说明。
关于操作符的更多详细信息,请参阅文档。
使用Rug
Rug可在crates.io上找到。要在您的crate中使用Rug,请将其添加到Cargo.toml中的依赖项。
[dependencies]
rug = "1.25"
Rug需要rustc版本1.65.0或更高版本。
Rug还依赖于通过gmp-mpfr-sys crate中的低级FFI绑定来使用的GMP、MPFR和MPC库,这需要一些设置来构建;有关在GNU/Linux、macOS和Windows下使用的一些详细信息,请参阅gmp-mpfr-sys文档。
可选功能
Rug crate有六个可选功能
integer,默认启用。对于Integer类型及其支持功能是必需的。rational,默认启用。对于Rational数类型及其支持功能是必需的。此功能需要integer功能。float,默认启用。对于Float类型及其支持功能是必需的。complex,默认启用。对于Complex数类型及其支持功能是必需的。此功能需要float功能。rand,默认启用。对于RandState类型及其支持功能是必需的。此功能需要integer功能。std,默认启用。这是用于在no_std下不可用功能的特性,例如返回String或实现Error特性的方法。serde默认禁用。此功能为Integer、Rational、Float和Complex数字类型提供序列化支持,前提是它们被启用。此功能需要std功能和serde crate。
前六个可选功能默认启用;要选择性地使用功能,您可以将依赖项添加到Cargo.toml中。
[dependencies.rug]
version = "1.25"
default-features = false
features = ["integer", "float", "std"]
在此情况下,仅启用了integer、float和rand功能。如果没有选择任何功能,则不需要gmp-mpfr-sys crate,因此不启用。在这种情况下,crate仅提供Assign特性和ops模块中的特性。
实验性可选功能
如果以下实验性功能被删除,则不会被视为破坏性变更。删除实验性功能将需要微版本号升级。同样,在微版本号升级时,可选依赖项可以更新到不兼容的新版本。
num-traits默认禁用。此功能实现了num-traits crate和num-integer crate中的一些特性。(计划在num-traits crate和num-integer crate达到1.0.0版本后将其提升为可选功能。)
依赖项
~0.6–6MB
~129K SLoC