pi_num_cmp
pi_num_cmp 是一个 Rust 库,提供了跨类型数值比较功能。它通过 NumCmp trait 实现了不同类型数值(整数、浮点数、自定义的大整数引用)之间的安全比较操作,包括:
- 有符号/无符号整数比较
- 整数与浮点数比较,NaN 总是大于任何数值
- 原生类型与自定义的大整数引用(
BigUint/BigInt)比较
BigUint/BigInt 为自定义的大整数引用类型,支持任意大小的整数比较,并优化了性能。特点:
- 为序列化后的二进制做优化,避免堆内存分配
- 要求参数为字节数组引用,大整数在字节数组中高位在前,低位在后
- 和浮点数比较时, 分解浮点数的整数部分和小数部分,分别比较
- 大数库建议使用
malachite库,性能远优于num-bigint库
功能特点
-
跨类型比较:
- 支持所有原生整数类型(i8/u8/usize/isize 到 i128/u128)
- 支持浮点数类型(f32/f64),NaN 总是大于任何数值
- 支持自定义的大整数引用类型(
BigUint/BigInt)
-
完整的
NumCmptrait 比较操作: -
正确处理特殊值:
- Float可比较, NaN 总是大于任何数值,和
order_float库一致 - 除NaN, INFINITY总是大于任何数值
- NEG_INFINITY总是小于任何数值
- 正确处理浮点数精度问题
- Float可比较, NaN 总是大于任何数值,和
-
零开销抽象:
- 针对不同数值类型组合优化了实现策略
- 避免堆内存分配
- 内联优化关键路径
安装
在 Cargo.toml 中添加依赖:
[]
= "0.1"
使用示例
基本比较
use NumCmp;
use Ordering;
// 不同类型数值比较
assert!;
assert!;
// 浮点数精度处理
assert_eq!;
assert_ne!;
// NaN 处理
assert_eq!;
从malachite的大整数转成自定义的大整数引用
use ;
use ;
// 创建自定义的大整数引用
let natural = from;
let mut limbs = natural.limbs;
let mut vec = Vecwith_capacity;
// 先写高位,再写低位
while let Some = limbs.next_back
assert_eq!;
// 创建自定义的大整数引用
let big_uint = new;
assert_eq!;
// 原生类型与自定义大整数引用比较
assert!;
assert!;
assert!;
assert!;
大整数支持
use ;
// 创建自定义的大整数引用
let big_uint = new; // 65534
let big_int = new; // -128
// 原生类型与自定义大整数引用比较
assert!;
assert!;
// 带符号比较
assert!;
assert!;
浮点数与大整数比较
use ;
assert!;
assert!;
assert!;
assert!;
assert!;
性能特点
pi_num_cmp 针对不同数值类型组合实现了多种优化策略:
- 直接比较:相同类型时使用原生比较操作
- 安全转换:可无损转换时进行安全类型转换
- 符号处理:优化有符号/无符号类型比较
- 边界检查:处理浮点数的整数表示边界
- 大整数优化:
- 避免堆内存分配
- 使用前缀比较优化
- 特殊处理常见位宽(64/128位)
应用场景
- 科学计算和数值分析
- 财务计算和货币处理
- 数据验证和边界检查
- 自定义数据结构中的值比较
- 序列化后的数值比较
贡献指南
欢迎贡献!请遵循以下步骤:
- 提交 issue 描述问题或新功能建议
- Fork 仓库并创建特性分支
- 添加测试用例覆盖所有修改
- 运行测试:
cargo test --all-features - 提交 pull request
许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件。