#complex-numbers #rational-numbers #gmp #bignum

no-std rug

基于GMP、MPFR和MPC的任意精度整数、有理数、浮点数和复数

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

Download history 3188/week @ 2024-05-04 3564/week @ 2024-05-11 3028/week @ 2024-05-18 2842/week @ 2024-05-25 3451/week @ 2024-06-01 4804/week @ 2024-06-08 3101/week @ 2024-06-15 2802/week @ 2024-06-22 1940/week @ 2024-06-29 2377/week @ 2024-07-06 3391/week @ 2024-07-13 3147/week @ 2024-07-20 2657/week @ 2024-07-27 2480/week @ 2024-08-03 3256/week @ 2024-08-10 2225/week @ 2024-08-17

11,080 每月下载次数
用于 170 个Crate(130直接使用)

LGPL-3.0+

2MB
33K SLoC

任意精度数字

Rug提供具有任意精度和正确舍入的整数和浮点数

  • Integer 是一个任意精度的bignum整数,
  • Rational 是一个任意精度的bignum有理数,
  • Float 是一个具有正确舍入的多精度浮点数,并且
  • Complex 是一个具有正确舍入的多精度复数。

Rug是以下GNU库的高级接口

  • GMP 用于整数和有理数,
  • MPFR 用于浮点数,以及
  • MPC 用于复数。

Rug是免费软件:您可以在自由软件基金会发布的GNU较小于通用公共许可证(LGPL)的条款下重新分发和/或修改它,许可证版本为3,或者(根据您的选择)任何更高版本。有关GNU LGPLGNU 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::parseInteger::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);

在这里,ab没有被消耗,而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绑定来使用的GMPMPFRMPC库,这需要一些设置来构建;有关在GNU/LinuxmacOSWindows下使用的一些详细信息,请参阅gmp-mpfr-sys文档

可选功能

Rug crate有六个可选功能

  1. integer,默认启用。对于Integer类型及其支持功能是必需的。
  2. rational,默认启用。对于Rational数类型及其支持功能是必需的。此功能需要integer功能。
  3. float,默认启用。对于Float类型及其支持功能是必需的。
  4. complex,默认启用。对于Complex数类型及其支持功能是必需的。此功能需要float功能。
  5. rand,默认启用。对于RandState类型及其支持功能是必需的。此功能需要integer功能。
  6. std,默认启用。这是用于在no_std下不可用功能的特性,例如返回String或实现Error特性的方法。
  7. serde默认禁用。此功能为IntegerRationalFloatComplex数字类型提供序列化支持,前提是它们被启用。此功能需要std功能和serde crate

前六个可选功能默认启用;要选择性地使用功能,您可以将依赖项添加到Cargo.toml中。

[dependencies.rug]
version = "1.25"
default-features = false
features = ["integer", "float", "std"]

在此情况下,仅启用了integerfloatrand功能。如果没有选择任何功能,则不需要gmp-mpfr-sys crate,因此不启用。在这种情况下,crate仅提供Assign特性和ops模块中的特性。

实验性可选功能

如果以下实验性功能被删除,则不会被视为破坏性变更。删除实验性功能将需要微版本号升级。同样,在微版本号升级时,可选依赖项可以更新到不兼容的新版本。

  1. num-traits默认禁用。此功能实现了num-traits cratenum-integer crate中的一些特性。(计划在num-traits cratenum-integer crate达到1.0.0版本后将其提升为可选功能。)

依赖项

~0.6–6MB
~129K SLoC