【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)
一、源码
这段代码定义了一个 NonZeroBinFrac trait,用于表示合法的二进制小数部分结构。它使用了 类型级编程(type-level programming) 来递归地构造任意长度的二进制小数部分。
use crate::number::{Null, I, BFrac, Bit};// ===== 非零小数部分实现 =====
/// 标记合法的小数部分结构体
pub trait NonZeroBinFrac: Default {}// 基础实现:最低位小数位
impl NonZeroBinFrac for BFrac<I, Null> {}// 递归实现:更高位小数位
impl<H: Bit, L: NonZeroBinFrac> NonZeroBinFrac for BFrac<H, L> {}
二、代码解析
- 导入依赖
use crate::number::{Null, I, BFrac, Bit};
-
Null: 表示类型级编程中的 “终止” 或 “空” 类型(类似于链表末尾的 None)。
-
I: 代表二进制位 1(Bit 的一种实现)。
-
BFrac<H, L>: 一个二进制小数部分的类型,其中:
-
H 是当前最高位(Head),必须实现 Bit(二进制位)。
-
L 是剩余部分(Tail),可以是 Null 或另一个 BFrac。
-
-
Bit: 表示二进制位的 trait(可能包括 0 和 1)。
- NonZeroBinFrac Trait
pub trait NonZeroBinFrac: Default {}
-
这个 trait 标记 一个类型是合法的二进制小数部分。
-
它继承 Default,意味着所有实现它的类型必须可以构造默认值(如 0.0 或 0.1 等)。
-
它本身没有方法,仅用于类型约束(类似 std::marker::PhantomData)。
- 基础情况(Base Case)
impl NonZeroBinFrac for BFrac<I, Null> {}
-
表示最低位是 1,后面没有更多位 的小数(如 0.1)。
-
BFrac<I, Null> 的结构:
-
I(1)是当前位,
-
Null 表示终止(没有更多小数位)。
-
- 递归情况(Recursive Case)
impl<H: Bit, L: NonZeroBinFrac> NonZeroBinFrac for BFrac<H, L> {}
-
表示更高位的小数(如 0.101 或 0.011 等)。
-
BFrac<H, L> 的结构:
-
H 是当前最高位(0 或 1),必须实现 Bit。
-
L 是剩余部分,必须实现 NonZeroBinFrac(递归约束)。
-
-
这个实现允许无限扩展小数位数(如 0.1010101…)。
三、示例
假设我们有以下二进制小数:
-
0.1 → BFrac<I, Null>
-
0.01 → BFrac<O, BFrac<I, Null>>(O 是 0 的 Bit 实现)
-
0.101 → BFrac<I, BFrac<O, BFrac<I, Null>>>
这些结构都会实现 NonZeroBinFrac,因为它们最终递归终止于 BFrac<I, Null>。
四、总结
-
这段代码定义了一个 类型级二进制小数系统,确保所有合法的小数部分都能被正确构造。
-
它使用递归 trait 实现来约束合法的结构:
-
基础情况:0.1(BFrac<I, Null>)。
-
递归情况:0.xxxx(更高位的小数)。
-
-
这种设计常用于 类型安全的数值计算,例如在编译期确保小数部分的合法性。