【unitrix】 4.21 类型级二进制数基本结构体(types.rs)

一、源码

这段代码定义了一个类型级数值系统的 Rust 实现,主要用于在编译时表示和操作各种数值类型。

rust 复制代码
use crate::sealed::Sealed;
use crate::number::{NonZero, TypedInt, Unsigned, Primitive};
//===============================================
// 特殊浮点值枚举
//===============================================

/// 特殊浮点值(NaN/±∞)
#[derive(Debug, PartialEq, Default)]
pub enum Special {
    #[default]
    Nan,            // Not a Number
    Infinity,       // Positive infinity
    NegInfinity,    // 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> {}

二、代码分析

  1. 特殊浮点值枚举 (Special)
  • 表示三种特殊浮点值:

    • Nan (非数字)

    • Infinity (正无穷大)

    • NegInfinity (负无穷大)

  • 实现了 Debug, PartialEq 和 Default trait

  1. 基础数值类型表示
  • Z0: 表示二进制0的终结表示,类型系统中的原子常量

  • P1: 表示正号终结符/数值1

  • N1: 表示负号终结符/数值-1

  • B0: 表示二进制补码的0位,包含其他部分

  • B1: 表示二进制补码的1位,包含其他部分

  1. 复合数值类型表示

+FixedPoint<IntPart, FracPart>: 定点数表示

  • IntPart: 整数部分(二进制补码表示)

  • FracPart: 小数部分(二进制小数表示)

  • 示例:FixedPoint<B1, B1> 表示3.5

  • Decimal<Significand, Exponent>: 十进制数表示

    • Significand: 尾数(定点数表示)

    • Exponent: 指数(二进制补码表示10的幂)

  • Var: 原生数值的包装类型,用于与自定义类型交互

  1. 构造函数实现

为所有类型提供了简单的构造函数(new方法)

  1. Sealed trait 实现
  • 为所有类型实现了 Sealed trait

  • 这是一种设计模式,用于限制 trait 只能在当前模块中被实现

三、主要特点:

  • 类型级编程:使用 Rust 的类型系统在编译时表示数值

  • 二进制补码表示:用于表示有符号整数

  • 定点数支持:可以精确表示小数

  • 十进制科学计数法:通过 Decimal 类型支持

  • 类型安全:通过 trait bound 确保类型合法性

  • 零成本抽象:在编译时完成所有计算

这个系统可以用于需要高精度计算或编译时数值计算的场景,如金融计算、物理模拟等。通过类型系统保证数值的正确性,避免运行时错误。

相关推荐
m0_4805026413 小时前
Rust 登堂 之 函数式编程(三)
开发语言·后端·rust
小喷友20 小时前
阶段一:入门(理解 Rust 的基本概念)
前端·rust
m0_480502642 天前
Rust 入门 注释和文档之 cargo doc (二十三)
开发语言·后端·rust
盒马盒马2 天前
Rust:变量、常量与数据类型
开发语言·rust
傻啦嘿哟2 天前
Rust爬虫实战:用reqwest+select打造高效网页抓取工具
开发语言·爬虫·rust
咸甜适中2 天前
rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十四)垂直滚动条
笔记·学习·rust·egui
张志鹏PHP全栈3 天前
Rust第四天,Rust中常见编程概念
后端·rust
咸甜适中3 天前
rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十五)网格布局
笔记·学习·rust·egui
susnm4 天前
最后的最后
rust·全栈
bruce541105 天前
深入理解 Rust Axum:两种依赖注入模式的实践与对比(二)
rust