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 |
|
#15 在 数据结构
每月 355 次下载
在 2 个 crate 中使用 (通过 pliron)
325KB
7K SLoC
ApInt - 任意精度整数
Linux | Windows | Codecov | Coveralls | 文档 | Crates.io |
---|---|---|---|---|---|
开发中: 实现尚未完成,可能无法正常工作。
任意 精度 整数 (ApInt) 表示具有任意但固定运行时位宽的整数,并提供与机器整数相等的二进制补码模运算。
此库提供的整数类型包括
API 基于 LLVM APInt
支持库。
示例用例
- 在编译时模拟机器算术,例如用于常量评估和一些优化。
- SMT 求解器可以使用此作为位向量理论的底层模型。
- 用于加密密钥的操作和后端。
- 也可用作具有运行时长度信息的简单位集。
内部结构
设计重点是效率和健壮性。 ApInt
实例是针对小值优化的。这意味着只有位宽大于 64 位的 ApInt
实例分配动态内存。
ApInt
由一系列 64 位 Digit
组成。计算在它们的 128 位 DoubleDigit
形式中进行,以防止溢出或下溢时位丢失。这暗示了对 128 位整数的依赖,而目前 Rust 中的 128 位整数是不稳定的。
差异与相似之处
下表列出了 ApInt
和 num::BigInt
之间的公共和内部差异。
主题 | num::BigInt |
ApInt |
---|---|---|
抽象 | 高级无界整数。 | 二进制补码机器整数。 |
行为 | 大多数情况下表现为不可变类型。这导致大量副本,但提高了可用性。 | API 设计侧重于高效操作和机器仿真。 |
小值优化 | 否 | 是:最多 64 位。 |
构建块 | 32 位 BigDigit 即 u32 |
64 位 Digit |
计算单元 | 64 位 DoubleBigDigit 即 u64 |
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
包装器,存储运行时符号信息。这与Int
和UInt
不同,因为那些类型将它们的符号不可变地存储在它们自己的类型中。这与 LLVM 的APSInt
数据类型相同。
许可证
根据您选择的以下许可证之一授权:
- Apache 许可证第 2 版(《LICENSE-APACHE》或 http://www.apache.org/licenses/LICENSE-2.0》)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
任选其一。
双许可证:
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交的任何旨在包含在作品中的贡献都应按上述方式双许可,而无需任何额外的条款或条件。
发行说明
版本 0.2.0 - 2018-05-16
- 向
Int
,UInt
和ApInt
添加Binary
,LowerHex
和UpperHex
实现。
请注意,对于八进制
的实现仍然缺失。
版本 0.1.0 - 2018-04-15
- 移除了
ApInt
、Int
和UInt
中的严格类型转换方法。 - 向
ApInt
、Int
和UInt
添加了into_bitnot
。 - 为相应的操作添加了除以零错误和错误处理。
- 添加了一个用于简单使用常用类型的 crate 预导入模块。
- 修复了
ApInt::sign_extend
和Int::extend
中的错误(问题 #15)。感谢 AaronKutch 报告问题! - 修复了许多公共实现块的 markdown 标题。
- 修复了多个公共 API 的文档注释,例如
ApInt::from_{i128, u128}
。 - 修复了由于转发到错误实现方法导致的几个小错误。
依赖项
~120–560KB