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 魔法豆

Download history 18/week @ 2024-04-14 46/week @ 2024-04-21 60/week @ 2024-04-28 39/week @ 2024-05-05 89/week @ 2024-05-12 84/week @ 2024-05-19 134/week @ 2024-05-26 82/week @ 2024-06-02 45/week @ 2024-06-09 152/week @ 2024-06-16 99/week @ 2024-06-23 95/week @ 2024-06-30 96/week @ 2024-07-07 86/week @ 2024-07-14 114/week @ 2024-07-21 175/week @ 2024-07-28

每月471次下载
用于 10 个crate(直接使用4个)

Apache-2.0

210KB
4.5K SLoC

injective-math


◦ injective-math

Rust


📖 目录


📍 概述

该仓库托管一个主要用于金融计算和科学计算的先进数学库,特别兼容Injective Protocol生态系统中CosmWasm合约。它具有自定义定点小数类型(FPDecimal),支持算术、比较、显示格式化、序列化、根查找算法和向量操作。高精度和健壮的错误处理是关键特性,满足金融交易和智能合约开发对准确性的严格要求。此外,包含根查找技术和大型数算术实用工具,强调了其在解决广泛数学挑战方面的全面性。


📦 功能

功能 描述
⚙️ 架构 一个基于Rust的库,专注于固定点小数的高精度算术,适用于与区块链相关的数学计算。
📄 文档 代码内的文档概述了金融计算库及其数学工具的功能。在高级别上还不完整。
🔗 依赖项 外部依赖包括 cosmwasm-stdethereum-typesserde 等,配置用于 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)的函数,以及将不同整数类型的数组(u32Uint128)和字符串转换为FPDecimal对象数组的函数(int32_vec_to_fpdecint_vec_to_fpdecstr_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的虚函数三角函数(sinhcoshtanh)在Rust模块中。它包括具有详细实现的私有函数(_sinh_cosh_tanh)以及调用这些函数的相应公共方法,并将实例作为参数传递。实现使用指数函数、加法、减法和除法操作特定于FPDecimal。单元测试确认这些函数对于值为1的值产生预期的结果。
log.rs log.rs模块为FPDecimal值提供自然对数函数,处理基数e(欧拉数)及其幂(e^{11}),以及它们的倒数,将它们映射到相应的整数FPDecimal表示(分别从0到11和-1)。其他值不返回结果,表示对任意FPDecimal实例对数函数实现的限制。
arithmetic.rs 提供的Rust代码在数值库中定义了由FPDecimal结构体表示的定点十进制的算术运算,支持加法、减法、乘法、除法和取模计算。它处理可能存在符号差异的数字和精度管理。实现使用Rust的特性和如AddSubMulDiv及其赋值变体来集成与原生操作符(+-*/等)。其他实用函数允许确定绝对值、计算绝对差值和通过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结构体,它支持从标准整数和浮点数据类型进行转换,以及针对区块链相关类型(如Decimal256Uint128Uint256)的定制转换。它支持一元取反,提供数学值常量,有检查其状态的实用函数(零、整数、负数),并处理溢出条件。单元测试确认了常量、转换、符号处理、整数检查和舍入方法的正确性。树结构显示它是更大库的一部分,该库专注于扩展算术和科学计算。
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实例,这些实例似乎代表具有numsign属性的定点十进制数。实现了OrdPartialOrdPartialEq特质,以通过标准运算符(<<=>>===!=)进行比较。额外的maximumminimum方法分别返回两个FPDecimal实例中的较大或较小值。单元测试验证了这些比较和方法的正确性。
utils.rs 该代码片段来自一个旨在处理高精度算术运算的Rust项目,特别关注一个名为fp_decimal的模块。该项目针对Cargo(Rust的包管理器)进行了配置,这由.cargo/configCargo.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

-ℹ️...

🔧 安装

  1. 克隆存储库
git clone ../
  1. 切换到项目目录
cd
  1. 安装依赖项
cargo build

🤖 运行

cargo run

🧪 测试

cargo test

🤝 贡献

欢迎贡献力量!以下是一些您可以贡献的方式

贡献指南

点击展开
  1. 将存储库分叉:首先将项目存储库分叉到您的GitHub帐户。
  2. 本地克隆:使用Git客户端将分叉的存储库克隆到您的本地机器。
    git clone <your-forked-repo-url>
    
  3. 创建新分支:始终在一个新分支上工作,给它一个描述性的名称。
    git checkout -b new-feature-x
    
  4. 进行更改:在本地开发和测试您的更改。
  5. 提交更改:提交带有清晰简洁的消息的更改,描述您的更新。
    git commit -m 'Implemented new feature x.'
    
  6. 推送到GitHub:将更改推送到您的分叉存储库。
    git push origin new-feature-x
    
  7. 提交拉取请求:针对原始项目存储库创建PR。清楚地描述更改及其动机。

一旦您的PR被审查和批准,它将被合并到主分支。


返回


依赖项

~4–7.5MB
~149K SLoC