一、源碼
這段代碼定義了一個類型級二進制小數系統,用于在編譯時表示和驗證二進制小數部分的有效性。
use crate::number::{F0, BFrac, Bit};/// 標記合法的二進制小數部分類型
pub trait BinFrac: Copy + Default + 'static {}// 空小數部分(表示值為0)
impl BinFrac for F0 {}// 遞歸實現:更高位小數位
impl<B: Bit, F: BinFrac> BinFrac for BFrac<B, F> {}
二、核心概念
- 基礎類型
- F0: 表示空的小數部分(值為 0)
- Bit: 表示單個比特(0 或 1)的 trait
- BFrac<B, F>: 表示二進制小數的泛型類型,其中:
- B 是當前最高位比特(Bit 類型)
- F 是剩余的小數部分(BinFrac 類型)
- BinFrac Trait 的作用
pub trait BinFrac: Copy + Default + 'static {}
這是一個標記 trait(marker trait),主要目的:
-
類型驗證:確保只有合法的小數類型才能被使用
-
編譯時保障:防止無效的小數類型被誤用
-
trait 約束:為其他需要小數參數的函數提供類型約束
三、實現細節
- 空小數實現 (F0)
impl BinFrac for F0 {}
-
表示小數部分為 0(如:101. → 整數部分后面沒有小數)
-
是所有小數類型的終止條件
- 遞歸實現 (BFrac<B, F>)
impl<B: Bit, F: BinFrac> BinFrac for BFrac<B, F> {}
-
遞歸定義:每個 BFrac 包含一個比特和剩余的小數部分
-
類型安全:要求 B 是合法比特,F 是合法小數
四、二進制小數表示
// 小數 0.101 (二進制) = 0.625 (十進制)
// 類型表示:BFrac<B1, BFrac<B0, BFrac<B1, F0>>>
// 解釋:
// - 第一位:1 (0.5)
// - 第二位:0 (0.0)
// - 第三位:1 (0.125)
// 總和:0.5 + 0 + 0.125 = 0.625
五、技術特點
-
遞歸結構:無限長度的二進制小數表示
-
編譯時驗證:只有合法的結構才能實現 BinFrac
-
零成本抽象:運行時無開銷
-
類型安全:防止無效的小數構造
六、使用示例
// 定義具體的小數類型
type Half = BFrac<B1, F0>; // 0.1 (二進制) = 0.5 (十進制)
type Quarter = BFrac<B0, BFrac<B1, F0>>; // 0.01 (二進制) = 0.25 (十進制)// 函數約束:只接受合法小數
fn process_fraction<F: BinFrac>(frac: F) {// 安全處理小數
}// 編譯時驗證
process_fraction(Half); // ? 合法
process_fraction(Quarter); // ? 合法
// process_fraction(SomeInvalidType); // ? 編譯錯誤
七、應用場景
這種設計特別適合:
-
定點數運算:精確的小數表示
-
硬件寄存器配置:位字段的類型安全操作
-
財務計算:避免浮點數精度問題
-
嵌入式系統:編譯時確定的小數值
這是一個優雅的類型級編程示例,展示了如何在編譯時確保數據的有效性和正確性。