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

【unitrix】 6.18 二进制小数特质(t_decimal.rs)

一、源码

这是一个 Rust 的类型级编程(Type-level Programming)实现,用于在编译期表示和处理二进制小数。

use crate::number::{Null, I, B, Bit, TInt, TNumber};// ===== 小数部分实现 =====
/// 小数部分的结构表示特性
/// 
/// 这个trait标记了合法的小数部分结构
trait TFractPartStruct {}// 基础情况:最低位小数位
impl TFractPartStruct for B<I, Null> {}// 递归情况:更高位小数位
impl<H: Bit, L: TFractPartStruct> TFractPartStruct for B<H, L> {}/// 小数部分的类型表示特性
/// 
/// 这个trait标记了所有合法的小数部分类型
pub trait TFractPart {}// 空小数部分
impl TFractPart for Null {}// 非空小数部分
impl<F: TFractPartStruct> TFractPart for F {}// ===== 小数实现 =====
/// 类型级小数表示特性
/// 
/// 同时包含整数部分和小数部分的数字
pub trait TDecimal: TNumber {}// 十进制数由整数部分和小数部分组成
impl<H: TInt, L: TFractPart> TDecimal for B<H, L> {}

二、代码分析

  1. 基础类型导入
use crate::number::{Null, I, B, Bit, TInt, TNumber};
从模块中导入基础类型:
  • Null:表示空/终止的类型

  • I:表示数字1的类型

  • B:二元构造器,用于构建类型级数字

  • Bit:位类型特征

  • TInt:整数类型特征

  • TNumber:类型级数字类型特征

  1. 小数部分实现
    2.1 小数结构特征

trait TFractPartStruct {}
  • 这是一个标记特征(Marker Trait),用于标识合法的小数部分结构

2.2 基础情况实现


impl TFractPartStruct for B<I, Null> {}
  • 表示最低位小数位:B<I, Null>可以理解为二进制的".1"

  • 这是递归的基准情况

2.3 递归实现


impl<H: Bit, L: TFractPartStruct> TFractPartStruct for B<H, L> {}
  • 递归定义更高位的小数位

  • H是当前位(必须实现Bit),L是剩余的小数部分(必须实现TFractPartStruct)

  • 例如:B<1, B<0, B<1, Null>>>表示".101"

2.4 小数部分特征


pub trait TFractPart {}
  • 公开特征,表示所有合法的小数部分类型

2.5 空小数实现


impl TFractPart for Null {}
  • 表示没有小数部分的情况

2.6 非空小数实现


impl<F: TFractPartStruct> TFractPart for F {}
  • 任何实现了TFractPartStruct的类型都自动实现TFractPart
  1. 十进制数实现
    3.1 十进制数特征

pub trait TDecimal: TNumber {}
  • 公开特征,表示十进制数

  • 继承自TNumber,表明这是一个数字类型

3.2 十进制数实现


impl<H: TInt, L: TFractPart> TDecimal for B<H, L> {}
  • 定义二进制小数的结构:由整数部分H(必须实现TInt)和小数部分L(必须实现TFractPart)组成

  • 例如:B<B<P1, I >, B<I, Null>>表示"3.1"

三、整体理解

这个系统使用类型组合来表示二进制小数:

  • 整数部分:实现TInt的类型

  • 小数部分:递归的二进制位组合,以Null结尾

  • 通过B<H, L>组合整数和小数部分

这种类型级编程的优点是可以在编译期进行数值计算和类型检查,保证类型安全,常用于嵌入式系统或需要高性能计算的场景。

http://www.dtcms.com/a/301866.html

相关文章:

  • EPOLLET 边缘触发模式深度解析
  • 抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
  • vue3的一些浅显用法
  • Day06–哈希表–242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
  • 浙大公开课—基于深度学习的特征匹配与姿态估计
  • (补题)拼图游戏
  • EPOLLIN事件的详细解析
  • 【时时三省】(C语言基础)指针数组和多重指针
  • MySQL 8.4 Windows 版安装记录与步骤参考
  • 【C语言网络编程基础】DNS 协议与请求详解
  • Context Engineering Notes
  • 持续优化Cypress自动化测试
  • FunctionCall 如何使用以及如何训练
  • 从MySQL的information_schema系统数据库中获取表的元数据信息
  • Dify 1.7.0 新特性解析:工作流革新与多模态能力突破
  • 基于springboot的在线购票系统/在线售票系统
  • WSL切换网络模式
  • 【通识】正则表达式
  • 一些免费的线上学习网站
  • 《前端缓存系统构建:浏览器与Service Worker的自动清理与命中率优化策略》
  • 影刀RPA_初级课程_玩转影刀自动化_网页操作自动化
  • Frontiers in Psychology投稿LaTeX(三)
  • Frontiers in Psychology投稿流程(二)
  • BUG记录——Request接传Json数据中文乱码
  • 2025年7月世界人工智能大会最新消息
  • ABP VNext + Mapster:高性能对象映射
  • C语言——关于指针(逐渐清晰版)
  • MyBatis-Plus 多数据源配置指南
  • Android Framework知识点
  • 单链表的冒泡排序实现:从原理到代码详解