当前位置: 首页 > ds >正文

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

一、源码

这段代码定义了一个类型级数值系统的 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> {}

二、代码分析

  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方法)
5. Sealed trait 实现

  • 为所有类型实现了 Sealed trait

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

三、主要特点:

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

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

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

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

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

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

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

http://www.xdnf.cn/news/15289.html

相关文章:

  • 1965–2022年中国大陆高分辨率分部门用水数据集,包含:灌溉用水、工业制造用水、生活用水和火电冷却
  • C语言的程序控制语句
  • VR协作海外云:跨国企业沉浸式办公解决方案
  • 决策树算法在医学影像诊断中的广泛应用
  • ch07 题解
  • 番外-linux系统运行.net framework 4.0的项目
  • [特殊字符]远程服务器配置pytorch环境
  • 设计模式笔记_结构型_代理模式
  • 基于vscode开发工具显示git提交信息的插件
  • 世界现存燃油汽车品牌起源国别梳理
  • 【实时Linux实战系列】硬实时与软实时设计模式
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_max
  • 基于开源AI智能名片链动2+1模式与S2B2C商城小程序的渠道选择策略研究
  • BPE(Byte Pair Encoding)分词算法
  • flutter鸿蒙版 环境配置
  • 在前端项目中是如何解决跨域的
  • 解决Vue页面黑底红字遮罩层报错:Unknown promise rejection reason (webpack-internal)
  • CSP-J/S 参赛选手注册报名流程
  • 智能文本抽取在合同管理实战应用
  • AIC8800M40低功耗wifi在ARM-LINUX开发板上做OTA的调试经验
  • 借助 Wisdom SSH AI 助手,轻松安装 CentOS 8 LNMP 环境
  • 2025前端面试真题以及答案-不断整理中,问题来源于牛客真题
  • CMU15445-2024fall-project1踩坑经历
  • hive/spark sql中unix_timestamp 函数的坑以及时间戳相关的转换
  • 串行数据检测器,检测到011,Y输出1,否则为0.
  • RabbitMQ 之顺序性保障
  • 从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
  • uniapp-在windows上IOS真机运行(含开发证书申请流程)
  • 重振索尼复古微型电脑——计划以OrangePi CM5 作为主板升级
  • uniapp小程序tabbar跳转拦截与弹窗控制