30个版本
新 0.3.0 | 2024年8月6日 |
---|---|
0.2.4 | 2023年12月28日 |
0.2.3 | 2023年11月13日 |
0.1.18 | 2023年7月17日 |
0.1.4 | 2022年5月9日 |
#1126 in 魔法豆
每月471次下载
用于 10 个crate(直接使用4个)
210KB
4.5K SLoC
injective-math
◦ injective-math
📖 目录
📍 概述
该仓库托管一个主要用于金融计算和科学计算的先进数学库,特别兼容Injective Protocol生态系统中CosmWasm合约。它具有自定义定点小数类型(FPDecimal
),支持算术、比较、显示格式化、序列化、根查找算法和向量操作。高精度和健壮的错误处理是关键特性,满足金融交易和智能合约开发对准确性的严格要求。此外,包含根查找技术和大型数算术实用工具,强调了其在解决广泛数学挑战方面的全面性。
📦 功能
功能 | 描述 | |
---|---|---|
⚙️ | 架构 | 一个基于Rust的库,专注于固定点小数的高精度算术,适用于与区块链相关的数学计算。 |
📄 | 文档 | 代码内的文档概述了金融计算库及其数学工具的功能。在高级别上还不完整。 |
🔗 | 依赖项 | 外部依赖包括 cosmwasm-std 、ethereum-types 和 serde 等,配置用于 WebAssembly 和区块链集成。 |
🧩 | 模块化 | 高度模块化,具有分别用于算术、比较、缩放、开方、向量计算、序列化、错误处理等功能的独立文件。 |
🧪 | 测试 | 库包含各种数学函数的单元测试,尽管提供的详细信息中没有评估测试覆盖率。 |
⚡️ | 性能 | 没有提供显式的性能指标,但 Rust 和定点算术的使用表明注重计算效率。 |
🔐 | 安全性 | 没有提到具体的安全措施,但受控的算术可以降低某些数值风险。通过 serde 处理序列化数据需要审查。 |
🔀 | 版本控制 | 版本遵循语义版本控制,当前版本为 0.2.3;详细的详细信息中没有指定版本控制策略。 |
🔌 | 集成 | 旨在与 WebAssembly 和 Injective 协议集成,意味着在区块链生态系统中具有良好的互操作性。 |
📶 | 可伸缩性 | 代码结构和 Rust 的使用表明可伸缩性;然而,在摘要中并没有明确说明实际的可伸缩性。 |
上述分析基于提供的目录结构和 Rust 项目的代码摘要,该项目专注于提供一个用于定点十进制算术的库,主要针对区块链应用。对提供的数据的这种解释反映了强大的模块化设计,并伴随着精心设计的文件结构,以组织广泛的数学计算功能。它似乎通过 Rust 的效率和细粒度错误和类型处理来针对性能。此外,通过 serde
的序列化和反序列化能力支持灵活的数据兼容性。然而,需要进行更深入的分析,特别是包括对实际性能指标、测试覆盖率、安全审计和可伸缩性测试的审查,才能提供更精确的评估。
📂 仓库结构
└── /
├── .cargo/
│ └── config
├── Cargo.toml
└── src/
├── fp_decimal/
│ ├── arithmetic.rs
│ ├── comparison.rs
│ ├── display.rs
│ ├── error.rs
│ ├── exp.rs
│ ├── factorial.rs
│ ├── from_str.rs
│ ├── hyper.rs
│ ├── log.rs
│ ├── mod.rs
│ ├── round.rs
│ ├── scale.rs
│ ├── serde.rs
│ ├── trigonometry.rs
│ └── utils.rs
├── lib.rs
├── root_findings.rs
├── utils.rs
└── vector.rs
⚙️ 模块
根目录
文件 | 摘要 |
---|---|
Cargo.toml | 代码代表了一个 Rust 项目清单,即 injective-math,这是一个针对 Injective 协议上的 CosmWasm 合同的数学库。它指定了软件包的元数据,包括作者、许可、描述和仓库链接。该项目配置为 Rust 2021 版本,版本号为 0.2.3。功能使能额外的测试功能,并包含 cosmwasm-std、ethereum-types 等特定版本的依赖项,其中一些具有可选功能。项目结构表明,模块包括定点十进制、实用工具、根查找算法和向量操作。 |
.cargo
文件 | 摘要 |
---|---|
config | 此 Rust 项目包含自定义配置和一个广泛的浮点十进制库。《code>.cargo/config 文件定义了针对 WebAssembly 的构建和测试别名,并启用了如回溯等特性。`src ` 目录结构表明,库提供了一系列数值操作、错误处理、序列化支持、实用工具,以及根查找和向量操作的其他功能,表明关注数学和科学计算。 |
Src
文件 | 摘要 |
---|---|
vector.rs | 提供的 Rust 代码定义了一系列用于 FPDecimal (一个定点十进制类型)向量的算术操作。这些操作包括求和元素、点积、逐元素乘以和除以常数、逐元素加法和减法,以及计算向量中元素绝对值。这些函数便于使用定点精度进行基于向量的计算。 |
lib.rs | 该代码提供了用于固定小数点金融计算的实用工具。它包括使用投资组合权重、价格和库存来计算资产群不平衡(imbalance )的函数,以及将不同整数类型的数组(u32 、Uint128 )和字符串转换为FPDecimal 对象数组的函数(int32_vec_to_fpdec 、int_vec_to_fpdec 、str_vec_to_fpdec )。imbalance 函数执行元素乘法、点积和缩放以进行最优资本配置比较。 |
root_findings.rs | 该代码实现了针对返回FPDecimal (一个固定小数点类型)的函数的根查找算法——牛顿法、离散牛顿法和哈雷法。它支持迭代,直到达到指定的精度(abs_error )或迭代次数(max_iter )。newton 函数通过函数及其导数来计算根。discrete_newton 方法近似导数并解决离散函数。通过引入二阶导数,halleys 扩展了牛顿法以实现更快的收敛。它不包含对复数的支持以及验证功能的测试用例。 |
utils.rs | 提供的Rust代码是金融计算库的一部分,包含用于操作固定精度小数(FPDecimal)数的实用函数。它包括解析指定范围内的十进制和整数、以特定精度四舍五入到刻度并确保值在给定范围内等功能。它处理输入的错误和验证,并避免除以零。代码组织有序,包含测试验证如地板、四舍五入、除法和刻度调整等行为,以确保精确的金融操作。 |
Fp_decimal
文件 | 摘要 |
---|---|
display.rs | 该代码为固定小数点类型FPDecimal 定义了一个Display 特质实现,将其格式化为带有可选负号、整数部分和小数部分的字符串,省略小数部分中的任何尾随零。它包括测试验证正数、负数和小数FPDecimal 值的正确字符串表示。 |
serde.rs | serde.rs 模块提供了使用Serde(一个Rust序列化框架)对自定义固定精度小数类型FPDecimal 进行序列化和反序列化的实现。序列化将FPDecimal 实例转换为十进制字符串,反序列化从字符串编码的十进制值构造FPDecimal ,对于解析失败具有健壮的错误处理。该模块包括一个针对FPDecimal 类型定制的反序列化访问者FPDecimalVisitor ,以确保与Serde的数据模型兼容。 |
error.rs | 提供的代码定义了一个数值库的Rust模块结构,核心目录专注于固定小数点操作(fp_decimal )。它包括算术、比较、显示格式化、错误处理、指数计算、阶乘计算、字符串转换、双曲函数、对数、四舍五入、缩放、序列化和三角学等功能的实现。位于fp_decimal 中的error.rs 文件定义了一个错误枚举(FPDecimalError ),用于处理库中的未定义和不支持的运算。 |
hyper.rs | 代码定义了用于定点十进制数据类型FPDecimal 的虚函数三角函数(sinh 、cosh 、tanh )在Rust模块中。它包括具有详细实现的私有函数(_sinh 、_cosh 、_tanh )以及调用这些函数的相应公共方法,并将实例作为参数传递。实现使用指数函数、加法、减法和除法操作特定于FPDecimal 。单元测试确认这些函数对于值为1的值产生预期的结果。 |
log.rs | log.rs 模块为FPDecimal 值提供自然对数函数,处理基数e (欧拉数)及其幂(e^{11}),以及它们的倒数,将它们映射到相应的整数FPDecimal 表示(分别从0到11和-1)。其他值不返回结果,表示对任意FPDecimal 实例对数函数实现的限制。 |
arithmetic.rs | 提供的Rust代码在数值库中定义了由FPDecimal 结构体表示的定点十进制的算术运算,支持加法、减法、乘法、除法和取模计算。它处理可能存在符号差异的数字和精度管理。实现使用Rust的特性和如Add 、Sub 、Mul 、Div 及其赋值变体来集成与原生操作符(+ 、- 、* 、/ 等)。其他实用函数允许确定绝对值、计算绝对差值和通过Sum 进行聚合。复杂乘法和除法保留精度,并且各种测试确保功能的可靠性和正确性。 |
from_str.rs | 提供的代码是Rust模块的一部分,定义了FromStr 特性实现,允许从字符串表示形式创建自定义定点十进制类型。它解析十进制字符串(如1.23 ),不进行舍入,对无效输入报错,并支持最多18位小数。FPDecimal 结构体有一个must_from_str 方法,如果转换失败则恐慌。单元测试验证了对负数、零和其他十进制字符串的解析,确保准确转换为内部表示。 |
scale.rs | scale.rs 代码为FPDecimal 类型定义了一个Scaled 特性,允许通过乘以10的幂进行十进制缩放操作。它包括调整FPDecimal 实例的缩放的实现以及返回预定义缩放因子10^18的dec_scale_factor 函数。两个测试验证了功能:一个检查正确的缩放上下,另一个确认预定义因子值。 |
exp.rs | 提供的Rust代码为FPDecimal 类型定义了一个exp_taylor_expansion 方法,该方法使用泰勒级数展开的前25项来计算指数a^b的近似值。该方法计算a 的自然对数,将其乘以b ,并通过乘以基数和将分母乘以从2到25的连续整数来迭代构建级数的项。它返回一个表示展开中每个项的FPDecimal 对象向量。 |
mod.rs | 此Rust代码定义了一个用于定点运算的FPDecimal 结构体,它支持从标准整数和浮点数据类型进行转换,以及针对区块链相关类型(如Decimal256 、Uint128 和Uint256 )的定制转换。它支持一元取反,提供数学值常量,有检查其状态的实用函数(零、整数、负数),并处理溢出条件。单元测试确认了常量、转换、符号处理、整数检查和舍入方法的正确性。树结构显示它是更大库的一部分,该库专注于扩展算术和科学计算。 |
trigonometry.rs | 提供的Rust代码定义了一个具有计算正弦和余弦函数的FPDecimal 结构体,这些函数使用泰勒级数展开进行不精确计算,以及一个角度归一化方法(_change_range ),该方法将输入角度包装到[0, 2π]范围内。正弦(_sin )和余弦(_cos )方法调用_change_range 以归一化角度并直接处理特定角度以优化效率。测试使用almost_eq 函数在1%的误差范围内验证精度,演示了正弦和余弦函数对0、1和-1角度输入的测试。 |
factorial.rs | 该代码提供了一个具有计算阶乘和伽玛函数的FPDecimal 结构体方法。阶乘方法支持正负整数,使用递归,对零输入返回FPDecimal::ONE 。伽玛函数使用预计算的常量表评估非整数值,采用Horner多项式评估法。单元测试验证了9和-9的阶乘计算,确保在FPDecimal 环境中正确解析和方法功能。 |
comparison.rs | 提供的代码定义了Rust特质以比较FPDecimal 实例,这些实例似乎代表具有num 和sign 属性的定点十进制数。实现了Ord 、PartialOrd 和PartialEq 特质,以通过标准运算符(< 、<= 、> 、>= 、== 和!= )进行比较。额外的maximum 和minimum 方法分别返回两个FPDecimal 实例中的较大或较小值。单元测试验证了这些比较和方法的正确性。 |
utils.rs | 该代码片段来自一个旨在处理高精度算术运算的Rust项目,特别关注一个名为fp_decimal 的模块。该项目针对Cargo(Rust的包管理器)进行了配置,这由.cargo/config 和Cargo.toml 文件表示。位于src/ 下的fp_decimal 目录包含多个Rust文件(*.rs ),每个文件可能处理定点十进制操作的各个方面,例如算术、比较、格式化、错误处理、指数运算、阶乘计算、解析、对数函数等。存在serde.rs 表明具有序列化和反序列化能力。在utils.rs 中导入FPDecimal 类型和U256 (一个256位无符号整数类型,可能来自外部bigint 库),这表明利用大整数支持的实用函数。 |
round.rs | 提供的目录树和文件路径表明这是一个关注固定精度十进制算术的Rust项目结构。代码在src/fp_decimal/round.rs 中暗示了在数值库的模块fp_decimal 中实现舍入函数,可能提供精确的算术操作(例如,加法、乘法)、特殊函数(例如,指数、对数)以及处理固定精度十进制数的实用程序,其中FPDecimal 是主要类型,而U256 表明底层数字表示为256位。模块还可能支持使用serde.rs 进行序列化。 |
🚀 开始使用
依赖项
请确保您的系统已安装以下依赖项
-ℹ️ 依赖项1
-ℹ️ 依赖项2
-ℹ️...
🔧 安装
- 克隆存储库
git clone ../
- 切换到项目目录
cd
- 安装依赖项
cargo build
🤖 运行
cargo run
🧪 测试
cargo test
🤝 贡献
欢迎贡献力量!以下是一些您可以贡献的方式
贡献指南
点击展开
- 将存储库分叉:首先将项目存储库分叉到您的GitHub帐户。
- 本地克隆:使用Git客户端将分叉的存储库克隆到您的本地机器。
git clone <your-forked-repo-url>
- 创建新分支:始终在一个新分支上工作,给它一个描述性的名称。
git checkout -b new-feature-x
- 进行更改:在本地开发和测试您的更改。
- 提交更改:提交带有清晰简洁的消息的更改,描述您的更新。
git commit -m 'Implemented new feature x.'
- 推送到GitHub:将更改推送到您的分叉存储库。
git push origin new-feature-x
- 提交拉取请求:针对原始项目存储库创建PR。清楚地描述更改及其动机。
一旦您的PR被审查和批准,它将被合并到主分支。
依赖项
~4–7.5MB
~149K SLoC