3个稳定版本
| 1.1.1 | 2024年6月25日 |
|---|---|
| 1.1.0 | 2024年4月17日 |
| 1.0.0 | 2023年12月6日 |
#1690 in 魔豆
每月43次下载
62KB
1.5K SLoC
soroban-fixed-point-math
为SOROBAN智能合约提供固定点数学的库。
安全性
这是一个实验性软件,按照“原样”和“可用”的原则提供。
我们不提供任何保证,并且不会对通过使用此代码库而产生的任何损失承担责任。
使用方法
将此添加到您的 Cargo.toml
[dependencies]
soroban_fixed_point_math = "<desired version>"
FixedPoint Trait
该 FixedPoint 特性针对Rust泛型整数 i64、u64、i128 和 u128 实现。在固定点数学计算过程中发生的任何溢出或除以零都将返回 None,与Rust现有的已检查数学函数保持一致。
幻影溢出是中间计算中溢出导致的结果,但预期结果应在范围内。此特性为每个实现的整数类型管理不同。
- i64 和 u64
- 在发生幻影溢出的情况下,中间计算会缩放到
i128/u128并重试。
- 在发生幻影溢出的情况下,中间计算会缩放到
- i128 和 u128
- 在发生幻影溢出的情况下,函数将终止并返回
None。如果您需要处理更大的数字,请使用SorobanFixedPoint特性。
- 在发生幻影溢出的情况下,函数将终止并返回
SorobanFixedPoint Trait
为 Soroban 主机类型 I256 和 U256 实现了 SorobanFixedPoint 特性。如果发生任何 I256 或 U256 算术错误,特性将导致程序崩溃,因为主机函数默认情况下会崩溃。
还包括了对 i128 和 u128 整数类型的 SorobanFixedPoint 特性的额外实现,以支持更大的中间计算。这消除了大多数 128 位定点数学的幻影溢出事件。
示例
对于任何实现 FixedPoint 的支持类型,你可以执行定点操作,如下所示
use soroban_fixed_point_math::FixedPoint;
let x: u64 = 1_5000000;
let y: u64 = 2_0000000;
assert_eq!(x.fixed_mul_floor(y, 1_0000000).unwrap(), 3_0000000);
对于任何实现 SorobanFixedPoint 的支持类型,你可以执行定点操作,如下所示
use soroban_fixed_point_math::SorobanFixedPoint;
use soroban_sdk::{Env, I256};
let env: Env //... from your contract, or Env::default() in a test
let x: I256 = I256::from_i32(&env, 1_5000000);
let y: I256 = I256::from_i32(&env, 2_0000000);
assert_eq!(x.fixed_mul_ceil(&x, &y, I256::from_i32(&env, 1_0000000)), 3_0000000);
致谢
这个库受到了许多来源的启发或直接修改,主要包括
WASM
支持 WASM 目标 wasm32-unknown-unknown。
贡献
欢迎贡献。请查阅贡献指南(待办事项)!
许可
此库在 MIT 许可证 下发布。
依赖
约 11-14MB
约 298K SLoC