7 个版本

使用旧 Rust 2015

0.2.0 2018 年 5 月 16 日
0.1.0 2018 年 4 月 15 日
0.0.5 2018 年 3 月 3 日
0.0.1 2018 年 2 月 7 日
0.0.0-alpha.6 2017 年 12 月 23 日

#15数据结构

Download history 120/week @ 2024-03-08 106/week @ 2024-03-15 40/week @ 2024-03-22 203/week @ 2024-03-29 112/week @ 2024-04-05 25/week @ 2024-04-12 31/week @ 2024-04-19 51/week @ 2024-04-26 101/week @ 2024-05-03 68/week @ 2024-05-10 14/week @ 2024-05-17 32/week @ 2024-05-24 54/week @ 2024-05-31 102/week @ 2024-06-07 139/week @ 2024-06-14 53/week @ 2024-06-21

每月 355 次下载
2 个 crate 中使用 (通过 pliron)

MIT/Apache

325KB
7K SLoC

ApInt - 任意精度整数

Linux Windows Codecov Coveralls 文档 Crates.io
travisCI appveyor codecov coveralls docs crates

开发中: 实现尚未完成,可能无法正常工作。

任意 精度 数 (ApInt) 表示具有任意但固定运行时位宽的整数,并提供与机器整数相等的二进制补码模运算。

此库提供的整数类型包括

  • ApInt: 一个没有静态符号信息的基础级任意精度整数。 (通用)
  • Int: 一个有符号的任意精度整数。 (为 iN 提供便利)
  • UInt: 一个无符号的任意精度整数。 (为 uN 提供便利)

API 基于 LLVM APInt 支持库。

示例用例

  • 在编译时模拟机器算术,例如用于常量评估和一些优化。
  • SMT 求解器可以使用此作为位向量理论的底层模型。
  • 用于加密密钥的操作和后端。
  • 也可用作具有运行时长度信息的简单位集。

内部结构

设计重点是效率和健壮性。 ApInt 实例是针对小值优化的。这意味着只有位宽大于 64 位的 ApInt 实例分配动态内存。

ApInt 由一系列 64 位 Digit 组成。计算在它们的 128 位 DoubleDigit 形式中进行,以防止溢出或下溢时位丢失。这暗示了对 128 位整数的依赖,而目前 Rust 中的 128 位整数是不稳定的。

差异与相似之处

下表列出了 ApIntnum::BigInt 之间的公共和内部差异。

主题 num::BigInt ApInt
抽象 高级无界整数。 二进制补码机器整数。
行为 大多数情况下表现为不可变类型。这导致大量副本,但提高了可用性。 API 设计侧重于高效操作和机器仿真。
小值优化 是:最多 64 位。
构建块 32 位 BigDigitu32 64 位 Digit
计算单元 64 位 DoubleBigDigitu64 128 位 DoubleDigit
有符号 否: num::BigUint 用于无符号。 否:操作知道符号。
内存::size_of<..> 大约 24 字节 + 一些符号信息。 恰好 128 位(16 字节)。
宽度互操作性 没有限制在具有不同位宽的 BigInt 实例之间操作。 只有具有相同位宽的 ApInt 实例才能互操作。
内存占用 由当前存储的值确定。 由位宽确定。
可以增长和缩小吗? 否,见上文。
不稳定的功能? 没有 自 Rust 1.26 起稳定。

当前状态

目前,实现的部分只有少数,尤其是大于 64 位的 ApInt 的实现不完整。

已实现的 API 模块的当前状态

模块 设计 实现 测试 待办事项
算术 完成 未完成 未完成
构造函数 完成 完成 完成
转换 完成 完成 未开始 问题 #4
位运算 完成 完成 未开始
位移 完成 完成 完成
关系运算 完成 完成 未开始
实用工具 完成 完成 未开始
序列化 完成 未完成 未完成 依赖于 arithmetic
to_primitive 完成 完成 完成
serde_impl(可选) 完成 完成 完成
rand_impl(可选) 完成 完成 完成

计划中的功能

  • 完整且高效的 ApInt 实现和良好的测试覆盖率。
  • 围绕 ApInt 的中级 ApsInt 包装器,存储运行时符号信息。这与 IntUInt 不同,因为那些类型将它们的符号不可变地存储在它们自己的类型中。这与 LLVM 的 APSInt 数据类型相同。

许可证

根据您选择的以下许可证之一授权:

任选其一。

双许可证: badge badge

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交的任何旨在包含在作品中的贡献都应按上述方式双许可,而无需任何额外的条款或条件。

发行说明

版本 0.2.0 - 2018-05-16

  • IntUIntApInt 添加 BinaryLowerHexUpperHex 实现。
    请注意,对于 八进制 的实现仍然缺失。

版本 0.1.0 - 2018-04-15

  • 移除了 ApIntIntUInt 中的严格类型转换方法。
  • ApIntIntUInt 添加了 into_bitnot
  • 为相应的操作添加了除以零错误和错误处理。
  • 添加了一个用于简单使用常用类型的 crate 预导入模块。
  • 修复了 ApInt::sign_extendInt::extend 中的错误(问题 #15)。感谢 AaronKutch 报告问题!
  • 修复了许多公共实现块的 markdown 标题。
  • 修复了多个公共 API 的文档注释,例如 ApInt::from_{i128, u128}
  • 修复了由于转发到错误实现方法导致的几个小错误。

依赖项

~120–560KB