#fixed-point #integer #big #int #no-std #serde-default

no-std awint_core

核心 no-std 和 no-alloc awint 功能

15 个重大版本更新

0.17.0 2024年2月21日
0.14.0 2023年12月5日
0.13.0 2023年10月5日
0.11.0 2023年6月5日
0.1.0 2021年7月6日

#2040数据结构

Download history 77/week @ 2024-03-11 33/week @ 2024-03-18 4/week @ 2024-03-25 55/week @ 2024-04-01 5/week @ 2024-04-08 15/week @ 2024-04-15 15/week @ 2024-04-22 26/week @ 2024-04-29 43/week @ 2024-05-06 38/week @ 2024-05-13 44/week @ 2024-05-20 79/week @ 2024-05-27 45/week @ 2024-06-03 75/week @ 2024-06-10 52/week @ 2024-06-17 29/week @ 2024-06-24

每月 202 次下载
用于 9 遗留(3 直接)

MIT/Apache

270KB
4.5K SLoC

任意宽整数

这些仓库共同构成了一个具有分离存储和功能结构的整数库,支持手动控制位宽和位宽相关的操作。它不是只有一个结构体包含所有分配和功能能力的库,而是有3种存储类型来管理分配:InlAwiExtAwiAwi。存在一个公共的 Bits 引用类型,用于管理固定宽度算术功能。大多数 Bits 操作都是 const,并且没有分配。由 InlAwi 支持的 Bits 可在编译时和 no-std 运行时进行大整数算术操作,而不需要任何分配器。由 ExtAwi 支持的 Bits 可在运行时使用动态位宽。 Awi 具有容量和便宜位宽调整大小。如果一个函数完全用 Bits 来编写,那么可以使用它们的 Deref<Target = Bits> 实现来作为该函数的参数的任何组合 InlAwiExtAwiAwi

还包括一个用于固定小数的泛型 FP 结构体,目前添加更多功能的开发正在进行中。将来,Awi 也应该能够像传统大整数库一样具有自动调整大小的函数。

BitsInlAwiawint_core 库提供。 ExtAwiAwiFPawint_ext 库提供。这种划分的原因是为了提供最大的灵活性,以满足 no-stdno-alloc 用例。 ExtAwi 不在 awint_core 中的特性标志下,因为如果一个没有 alloc 的项目同时依赖于 awint_coreawint_macros(它需要 ExtAwi),则特性标志将激活 awint_core 的通用编译。 awint_macros 库是一个带有几个构造工具的 proc-macro 库。 awint_dag 库提供了一种使用 awint 类型作为组合逻辑 DSL(领域特定语言)的方法。 awint 库将它们一起编译,并启用或禁用系统的不同部分,这取决于这些特性标志。

  • "const_support" 启用许多函数需要用于 const 的夜间特性。
  • "alloc" 启用需要分配器的部分。
  • "std" 启用需要 std 的部分。
  • "dag" 启用 awint_dag
  • "try_support" 启用一些特性,这些特性对于 dag::Optiondag::Result 完全工作所必需的。
  • "debug" 启用一些开发者功能。
  • "rand_support" 启用对 rand_core 的依赖,而不启用其默认特性。
  • "serde_support" 启用对 serde 的依赖,而不启用其默认特性。
  • "zeroize_support" 启用对 zeroize 的依赖,而不启用其默认特性。

注意:默认情况下,“std”和“try_support”被启用,使用 default-features = false 并选择特定的特性,以更具体的方式。

注意:从 Rust 1.70 版本开始,如果您尝试使用与宏一起的 "const_support",可能会遇到奇怪的 "erroneous constant used" 和 "deref_mut" 错误,除非您将以下内容添加到所有使用宏的 crate 根目录中。

#![feature(const_trait_impl)]
#![feature(const_mut_refs)]
#![feature(const_option)]

所有 的 crate 根目录,您在 const 上下文中使用宏。

注意:从 Rust 1.70 版本的某些版本开始,"const_support" 在夜间版本中不幸地损坏了(请参阅 https://github.com/AaronKutch/awint/issues/19)。

计划中的特性

这些目前因为优先考虑的其他开发和改进而没有实现。如果您希望这些特性更快实现,请打开一个问题或 PR。

  • 我们需要一个宏来优化 2 输入、1 输出函数到我们的就地风格函数。基本的就地赋值函数可以有虚拟对应物(例如,x.add_(y) 的替代方案是 z = x.add(y)z = x + y),宏优化存储创建和路由。
  • 将一些缺失的函数添加到 awint_dag 中的模拟原语。
  • 还有许多与 awint_dag 相关的事情要做。
  • FP 添加更多功能
  • 某种匹配宏
  • 将传统大整数库函数添加到 Awi
  • 如果可能,添加一个 const Karatsuba 算法到乘法,或者添加一个 fast_mul 函数到 awint_ext
  • 更好的字符串序列化和反序列化性能。大多数基本数值函数都经过了很好的优化,但与可能的性能相比,序列化性能目前非常差。
  • ExtAwi 添加自定义分配器参数
  • 某些格式化和序列化特质实现需要更多的工作。
  • 使 "const_support" 在稳定版上编译。这些 crate 中使用的几乎每个不稳定特性都是某种 const 特性,并且希望很快就能稳定下来。

依赖

~200KB