【unitrix】 6.18 二进制小数特质(t_decimal.rs)
一、源码
这是一个 Rust 的类型级编程(Type-level Programming)实现,用于在编译期表示和处理二进制小数。
use crate::number::{Null, I, B, Bit, TInt, TNumber};// ===== 小数部分实现 =====
/// 小数部分的结构表示特性
///
/// 这个trait标记了合法的小数部分结构
trait TFractPartStruct {}// 基础情况:最低位小数位
impl TFractPartStruct for B<I, Null> {}// 递归情况:更高位小数位
impl<H: Bit, L: TFractPartStruct> TFractPartStruct for B<H, L> {}/// 小数部分的类型表示特性
///
/// 这个trait标记了所有合法的小数部分类型
pub trait TFractPart {}// 空小数部分
impl TFractPart for Null {}// 非空小数部分
impl<F: TFractPartStruct> TFractPart for F {}// ===== 小数实现 =====
/// 类型级小数表示特性
///
/// 同时包含整数部分和小数部分的数字
pub trait TDecimal: TNumber {}// 十进制数由整数部分和小数部分组成
impl<H: TInt, L: TFractPart> TDecimal for B<H, L> {}
二、代码分析
- 基础类型导入
use crate::number::{Null, I, B, Bit, TInt, TNumber};
从模块中导入基础类型:
-
Null:表示空/终止的类型
-
I:表示数字1的类型
-
B:二元构造器,用于构建类型级数字
-
Bit:位类型特征
-
TInt:整数类型特征
-
TNumber:类型级数字类型特征
- 小数部分实现
2.1 小数结构特征
trait TFractPartStruct {}
- 这是一个标记特征(Marker Trait),用于标识合法的小数部分结构
2.2 基础情况实现
impl TFractPartStruct for B<I, Null> {}
-
表示最低位小数位:B<I, Null>可以理解为二进制的".1"
-
这是递归的基准情况
2.3 递归实现
impl<H: Bit, L: TFractPartStruct> TFractPartStruct for B<H, L> {}
-
递归定义更高位的小数位
-
H是当前位(必须实现Bit),L是剩余的小数部分(必须实现TFractPartStruct)
-
例如:B<1, B<0, B<1, Null>>>表示".101"
2.4 小数部分特征
pub trait TFractPart {}
- 公开特征,表示所有合法的小数部分类型
2.5 空小数实现
impl TFractPart for Null {}
- 表示没有小数部分的情况
2.6 非空小数实现
impl<F: TFractPartStruct> TFractPart for F {}
- 任何实现了TFractPartStruct的类型都自动实现TFractPart
- 十进制数实现
3.1 十进制数特征
pub trait TDecimal: TNumber {}
-
公开特征,表示十进制数
-
继承自TNumber,表明这是一个数字类型
3.2 十进制数实现
impl<H: TInt, L: TFractPart> TDecimal for B<H, L> {}
-
定义二进制小数的结构:由整数部分H(必须实现TInt)和小数部分L(必须实现TFractPart)组成
-
例如:B<B<P1, I >, B<I, Null>>表示"3.1"
三、整体理解
这个系统使用类型组合来表示二进制小数:
-
整数部分:实现TInt的类型
-
小数部分:递归的二进制位组合,以Null结尾
-
通过B<H, L>组合整数和小数部分
这种类型级编程的优点是可以在编译期进行数值计算和类型检查,保证类型安全,常用于嵌入式系统或需要高性能计算的场景。