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