一、源碼
這段代碼定義了一個類型級數值系統的 Rust 實現,主要用于在編譯時表示和操作各種數值類型。
use crate::sealed::Sealed;
use crate::number::{NonZero, TypedInt, Unsigned, Primitive};
//===============================================
// 特殊浮點值枚舉
//===============================================/// 特殊浮點值(NaN/±∞)
#[derive(Debug, PartialEq, Default)]
pub enum Special {#[default]Nan, // Not a NumberInfinity, // Positive infinityNegInfinity, // Negative infinity
}//===============================================
// 基礎數值類型表示
//===============================================/// 二進制0的終結表示(類型系統中的原子常量)
/// - 不能作為小數 `B0`/`B1` 的泛型參數
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct Z0;/// 正號或小數終結符/數值1表示:
/// - 獨立使用:值 = 1
/// - 作為泛型參數時:當前位=1,高位=0
/// - 示例:`B1<P1>` 表示二進制 `011`(十進制 +3)
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct P1;/// 負號終結符/數值-1表示:
/// - 獨立使用:值 = -1
/// - 作為泛型參數時:當前位=1,高位=1(二進制補碼)
/// - 示例:`B0<N1>` 表示二進制 `...1110`(十進制 -2)
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct N1;/// 二進制補碼的0位:
/// - `Other`: 整數的高位類型或小數的低位類型
/// - 示例:`B0<P1>` 表示二進制 `010`(十進制 +2)
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct B0<Other>(pub Other);impl<Other: NonZero> Default for B0<Other> {fn default() -> Self {B0(Default::default())}
}/// 二進制補碼的1位:
/// - `Other`: 整數的高位類型或小數的低位類型
/// - 示例:`B1<P1>` 表示二進制 `011`(十進制 +3)
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct B1<Other>(pub Other);impl<Other: NonZero> Default for B1<Other> {fn default() -> Self {B1(Default::default())}
}//===============================================
// 復合數值類型表示
//===============================================/// **定點數表示(整數部分 + 小數部分)**
/// - `IntPart`: 整數部分(二進制補碼表示,如 `B1<P1>` 表示整數 3)
/// - `FracPart`: 小數部分(二進制小數,單獨的Z0、P1,或使用 `B0`/`B1` 嵌套鏈表示并用 `P1` 結束)
///
/// # 表示規則
/// - **整數部分**:標準二進制補碼(同整數規則)
/// - **小數部分**:從高位到低位(2^{-1}, 2^{-2}, ...)的鏈式結構:
/// - `B0<Next>` = 當前小數位為 0
/// - `B1<Next>` = 當前小數位為 1
/// - `P1` = 為1,也是B0、B1結束符
/// - `Z0` = 單獨使用,表示0
///
/// # 示例
/// 3.5 的定點表示:
/// - 整數部分: `B1<P1>`(二進制 `11` = 3)
/// - 小數部分: `P1`(二進制 `0.1` = 0.5)
/// - 完整類型: `FixedPoint<B1<P1>, B1<Z0>>`
///
///
/// - 始終為無符號,二進制位是整數部分的延續
///
/// # 二進制布局規則
/// ```text
/// [符號位][整數位][小數位]
/// MSB -----------------> LSB
/// ```
///
/// # 編譯時強制約束
/// 1. 整數部分必須為合法二進制補碼形式
/// 2. 小數部分禁止包含 `Z0`
/// 3. 兩部分都必須以 `P1` 結尾
///
///
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct FixedPoint<IntPart, FracPart>(pub IntPart, pub FracPart);impl<IntPart: TypedInt, FracPart: Unsigned> Default for FixedPoint<IntPart, FracPart> {fn default() -> Self {FixedPoint(Default::default(), Default::default())}
}/// **類型級十進制數(尾數用二進制表示,指數為10的冪)**
/// - `Significand`: 尾數(定點數,用 `TypeInt` 表示)
/// - `Exponent`: 指數(二進制補碼表示10的冪)
/// - 目前不支持特殊值:NaN, ±∞
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct Decimal<Significand, Exponent>(pub Significand, pub Exponent);impl<Significand: NonZero, Exponent: TypedInt> Default for Decimal<Significand, Exponent> {fn default() -> Self {Decimal(Default::default(),Default::default())}
}/// **原生數值的包裝類型**
/// - 在自定義類型和原生類型間搭建橋梁
/// - 支持類型安全的運算符重載
/// - 示例:`Var(3) + P1` → `i32 + 類型級1`
#[derive(Eq, PartialEq, Debug, Clone, Copy, Default)]
pub struct Var<T>(pub T);//===============================================
// 構造函數實現
//===============================================impl Z0 {#[inline]pub fn new() -> Self { Z0 }
}impl P1 {#[inline]pub fn new() -> Self { P1 }
}impl N1 {#[inline]pub fn new() -> Self { N1 }
}impl<Other> B0<Other> {#[inline]pub fn new(other:Other) -> Self { B0(other) }
}impl<Other> B1<Other> {#[inline]pub fn new(other: Other) -> Self { B1(other) }
}impl<IntPart, FracPart> FixedPoint<IntPart, FracPart> {#[inline]pub fn new(intPart: IntPart, fracPart: FracPart) -> Self {FixedPoint(intPart, fracPart)}
}impl<Significand, Exponent> Decimal<Significand, Exponent> {#[inline]pub fn new(significand: Significand, exponent: Exponent) -> Self {Decimal(significand, exponent)}
}//===============================================
// Sealed trait 實現(模塊私有約束)
//===============================================impl Sealed for Special {}
impl Sealed for Z0 {}
impl Sealed for P1 {}
impl Sealed for N1 {}
impl<Other> Sealed for B0<Other> {}
impl<Other> Sealed for B1<Other> {}
impl<IntPart, FracPart> Sealed for FixedPoint<IntPart, FracPart> {}
impl<Significand, Exponent> Sealed for Decimal<Significand, Exponent> {}
impl<T: Primitive> Sealed for Var<T> {}
二、代碼分析
- 特殊浮點值枚舉 (Special)
-
表示三種特殊浮點值:
-
Nan (非數字)
-
Infinity (正無窮大)
-
NegInfinity (負無窮大)
-
-
實現了 Debug, PartialEq 和 Default trait
- 基礎數值類型表示
-
Z0: 表示二進制0的終結表示,類型系統中的原子常量
-
P1: 表示正號終結符/數值1
-
N1: 表示負號終結符/數值-1
-
B0: 表示二進制補碼的0位,包含其他部分
-
B1: 表示二進制補碼的1位,包含其他部分
- 復合數值類型表示
+FixedPoint<IntPart, FracPart>: 定點數表示
-
IntPart: 整數部分(二進制補碼表示)
-
FracPart: 小數部分(二進制小數表示)
-
示例:FixedPoint<B1, B1> 表示3.5
-
Decimal<Significand, Exponent>: 十進制數表示
-
Significand: 尾數(定點數表示)
-
Exponent: 指數(二進制補碼表示10的冪)
-
-
Var: 原生數值的包裝類型,用于與自定義類型交互
- 構造函數實現
為所有類型提供了簡單的構造函數(new方法)
5. Sealed trait 實現
-
為所有類型實現了 Sealed trait
-
這是一種設計模式,用于限制 trait 只能在當前模塊中被實現
三、主要特點:
-
類型級編程:使用 Rust 的類型系統在編譯時表示數值
-
二進制補碼表示:用于表示有符號整數
-
定點數支持:可以精確表示小數
-
十進制科學計數法:通過 Decimal 類型支持
-
類型安全:通過 trait bound 確保類型合法性
-
零成本抽象:在編譯時完成所有計算
這個系統可以用于需要高精度計算或編譯時數值計算的場景,如金融計算、物理模擬等。通過類型系統保證數值的正確性,避免運行時錯誤。