当前位置: 首页 > news >正文

【unitrix数间混合计算】2.20 比较计算(cmp.rs)

一、源码

这段代码是用Rust实现的一个类型级别的二进制数比较系统,它通过类型系统在编译期完成数值比较。

use crate::number::{Z0, O, I, Bin, BDecimal, BFrac, Negative, Greater, Less, Equal,Bit, Ord, BinPos, BinUnsigned, BinInt, BinNonZeroFrac, BinFrac,
};// ========== 核心特征 ==========
/// 类型比较(类似 `core::cmp::Ord::cmp`)
pub trait Cmp<Lhs, Rhs> where Self: Ord { type Output: Ord;
}// ========== 默认实现 ==========
impl<Lhs, Rhs> Cmp<Lhs, Rhs> for Greater { type Output = Greater; }
impl<Lhs, Rhs> Cmp<Lhs, Rhs> for Less    { type Output = Less;    }// ========== 位比较 ==========
impl Cmp<O, O> for Equal { type Output = Equal;  }
impl Cmp<O, I> for Equal { type Output = Less;   }
impl Cmp<I, O> for Equal { type Output = Greater; }
impl Cmp<I, I> for Equal { type Output = Equal;  }// ========== 整数比较 ==========
// -- 零比较 --
impl Cmp<Z0, Z0> for Equal { type Output = Equal; }
impl<P: BinPos> Cmp<Z0, P> for Equal          { type Output = Less;    }
impl<P: BinPos> Cmp<Z0, Negative<P>> for Equal { type Output = Greater; }// -- 正数比较 --
impl<P: BinPos> Cmp<P, Z0> for Equal { type Output = Greater; }
impl<H1, L1, H2, L2> Cmp<Bin<H1, L1>, Bin<H2, L2>> for Equal
whereH1: BinUnsigned, L1: Bit, H2: BinUnsigned, L2: Bit,Bin<H1, L1>: BinPos, Bin<H2, L2>: BinPos,Self: Cmp<H1, H2>,<Self as Cmp<H1, H2>>::Output: Cmp<L1, L2>,
{type Output = <<Self as Cmp<H1, H2>>::Output as Cmp<L1, L2>>::Output;
}
impl<P1: BinPos, P2: BinPos> Cmp<P1, Negative<P2>> for Equal { type Output = Greater; }// -- 负数比较 --
impl<P: BinPos> Cmp<Negative<P>, Z0> for Equal { type Output = Less; }
impl<P1: BinPos, P2: BinPos> Cmp<Negative<P1>, P2> for Equal { type Output = Less; }
impl<P1: BinPos, P2: BinPos> Cmp<Negative<P1>, Negative<P2>> for Equal
where Self: Cmp<P2, P1> {type Output = <Self as Cmp<P2, P1>>::Output;
}// ========== 小数比较 ==========
impl<H1, L1, H2, L2> Cmp<BDecimal<H1, L1>, BDecimal<H2, L2>> for Equal
whereH1: BinInt, L1: BinFrac, H2: BinInt, L2: BinFrac,Equal: Cmp<H1, H2>,<Equal as Cmp<H1, H2>>::Output: Cmp<L1, L2>,
{type Output = <<Equal as Cmp<H1, H2>>::Output as Cmp<L1, L2>>::Output;
}// ========== 纯小数部分比较 ==========
impl<H, L> Cmp<Z0, BFrac<H, L>> for Equal 
where H: Bit, L: BinFrac, BFrac<H, L>: BinNonZeroFrac {type Output = Less;
}
impl<H, L> Cmp<BFrac<H, L>, Z0> for Equal 
where H: Bit, L: BinFrac, BFrac<H, L>: BinNonZeroFrac {type Output = Greater;
}
impl<H1, L1, H2, L2> Cmp<BFrac<H1, L1>, BFrac<H2, L2>> for Equal
whereH1: Bit, L1: BinNonZeroFrac, H2: Bit, L2: BinNonZeroFrac,Equal: Cmp<H1, H2>,<Equal as Cmp<H1, H2>>::Output: Cmp<L1, L2>,
{type Output = <<Equal as Cmp<H1, H2>>::Output as Cmp<L1, L2>>::Output;
}

二、核心特征


pub trait Cmp<Lhs, Rhs> where Self: Ord { type Output: Ord;
}

定义了一个核心特征Cmp,用于比较两个类型Lhs和Rhs。Output关联类型表示比较结果,可以是Greater、Less或Equal。

三、默认实现


impl<Lhs, Rhs> Cmp<Lhs, Rhs> for Greater { type Output = Greater; }
impl<Lhs, Rhs> Cmp<Lhs, Rhs> for Less    { type Output = Less;    }

为Greater和Less提供了默认实现,直接返回自身。

四、位比较


impl Cmp<O, O> for Equal { type Output = Equal; }
impl Cmp<O, I> for Equal { type Output = Less; }
impl Cmp<I, O> for Equal { type Output = Greater; }
impl Cmp<I, I> for Equal { type Output = Equal; }

比较二进制位O(0)和I(1)的大小关系。

五、整数比较

  1. 零比较

impl Cmp<Z0, Z0> for Equal { type Output = Equal; }
impl<P: BinPos> Cmp<Z0, P> for Equal { type Output = Less; }
impl<P: BinPos> Cmp<Z0, Negative<P>> for Equal { type Output = Greater; }

比较零(Z0)与其他数的关系:零等于零,零小于任何正数,零大于任何负数。
2. 正数比较


impl<P: BinPos> Cmp<P, Z0> for Equal { type Output = Greater; }
impl<H1, L1, H2, L2> Cmp<Bin<H1, L1>, Bin<H2, L2>> for Equal
where ...
{type Output = ...;
}

正数比较:正数大于零,两个正数的比较通过递归比较高位和低位。
3. 负数比较


impl<P: BinPos> Cmp<Negative<P>, Z0> for Equal { type Output = Less; }
impl<P1: BinPos, P2: BinPos> Cmp<Negative<P1>, P2> for Equal { type Output = Less; }
impl<P1: BinPos, P2: BinPos> Cmp<Negative<P1>, Negative<P2>> for Equal
where ...
{type Output = ...;
}

负数比较:负数小于零和任何正数,两个负数的比较转换为比较它们的绝对值(正数部分)。

六、小数比较


impl<H1, L1, H2, L2> Cmp<BDecimal<H1, L1>, BDecimal<H2, L2>> for Equal
where ...
{type Output = ...;
}

小数比较:先比较整数部分,如果相等再比较小数部分。

七、纯小数比较


impl<H, L> Cmp<Z0, BFrac<H, L>> for Equal ... { type Output = Less; }
impl<H, L> Cmp<BFrac<H, L>, Z0> for Equal ... { type Output = Greater; }
impl<H1, L1, H2, L2> Cmp<BFrac<H1, L1>, BFrac<H2, L2>> for Equal
where ...
{type Output = ...;
}

纯小数比较:零小于任何纯小数,纯小数大于零,两个纯小数的比较先比较整数部分再比较小数部分。

八、总结

这个系统通过Rust的类型系统实现了编译期的数值比较,包括:

  • 二进制位比较

  • 整数比较(正数、零、负数)

  • 小数比较

  • 纯小数比较

所有比较操作都在编译期完成,不产生运行时开销。这种技术常用于需要高性能计算的领域或嵌入式系统编程。

http://www.dtcms.com/a/328948.html

相关文章:

  • Spring Boot (v3.2.12) + application.yml + jasypt 数据源加密连接设置实例
  • 25个自动化办公脚本合集(覆盖人工智能、数据处理、文档管理、图片处理、文件操作等)
  • 【电气】NPN与PNP
  • [C语言]第二章-从Hello World到头文件
  • 四分位数与箱线图
  • Redis持久化机制详解:RDB与AOF的全面对比与实践指南
  • 动静态库
  • FPGA的PS基础1
  • 【FPGA】初始Verilog HDL
  • c++编程题-笔记
  • kali linux 2025.2安装Matlab的详细教程
  • 通过限制网络访问来降低服务器被攻击风险的方法
  • 服务器如何应对SYN Flood攻击?
  • FluxApi - 使用Spring进行调用Flux接口
  • Gradle(三)创建一个 SpringBoot 项目
  • 深度学习(3):全连接神经网络构建
  • mysql的快照读与当前读的区别
  • 11G RAC数据文件创建到本地如何处理
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day3
  • 《算法导论》第 22 章 - 基本的图算法
  • [AXI5]AXI协议中的Scalar atomic和Vector atomic有什么区别?
  • 【算法】位运算经典例题
  • BM25:概率检索框架下的经典相关性评分算法
  • ADB 无线调试连接(Windows + WSL 环境)
  • 如何在VS里使用MySQL提供的mysql Connector/C++的debug版本
  • C++ 优选算法 力扣 209.长度最小的子数组 滑动窗口 (同向双指针)优化 每日一题 详细题解
  • Java Spring框架最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
  • graphql接口快速使用postman添加接口以及输入返回参数
  • 超越相似名称:Elasticsearch semantic text 如何在简洁、高效、集成方面超越 OpenSearch semantic 字段
  • 5.语句几个分类