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

【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)

一、源码

这段代码定义了一个 NonZeroBinFrac trait,用于表示合法的二进制小数部分结构。它使用了 类型级编程(type-level programming) 来递归地构造任意长度的二进制小数部分。

use crate::number::{Null, I, BFrac, Bit};// ===== 非零小数部分实现 =====
/// 标记合法的小数部分结构体
pub trait NonZeroBinFrac: Default {}// 基础实现:最低位小数位
impl NonZeroBinFrac for BFrac<I, Null> {}// 递归实现:更高位小数位
impl<H: Bit, L: NonZeroBinFrac> NonZeroBinFrac for BFrac<H, L> {}

二、代码解析

  1. 导入依赖

use crate::number::{Null, I, BFrac, Bit};
  • Null: 表示类型级编程中的 “终止” 或 “空” 类型(类似于链表末尾的 None)。

  • I: 代表二进制位 1(Bit 的一种实现)。

  • BFrac<H, L>: 一个二进制小数部分的类型,其中:

    • H 是当前最高位(Head),必须实现 Bit(二进制位)。

    • L 是剩余部分(Tail),可以是 Null 或另一个 BFrac。

  • Bit: 表示二进制位的 trait(可能包括 0 和 1)。

  1. NonZeroBinFrac Trait

pub trait NonZeroBinFrac: Default {}
  • 这个 trait 标记 一个类型是合法的二进制小数部分。

  • 它继承 Default,意味着所有实现它的类型必须可以构造默认值(如 0.0 或 0.1 等)。

  • 它本身没有方法,仅用于类型约束(类似 std::marker::PhantomData)。

  1. 基础情况(Base Case)

impl NonZeroBinFrac for BFrac<I, Null> {}
  • 表示最低位是 1,后面没有更多位 的小数(如 0.1)。

  • BFrac<I, Null> 的结构:

    • I(1)是当前位,

    • Null 表示终止(没有更多小数位)。

  1. 递归情况(Recursive Case)

impl<H: Bit, L: NonZeroBinFrac> NonZeroBinFrac for BFrac<H, L> {}
  • 表示更高位的小数(如 0.101 或 0.011 等)。

  • BFrac<H, L> 的结构:

    • H 是当前最高位(0 或 1),必须实现 Bit。

    • L 是剩余部分,必须实现 NonZeroBinFrac(递归约束)。

  • 这个实现允许无限扩展小数位数(如 0.1010101…)。

三、示例

假设我们有以下二进制小数:

  1. 0.1 → BFrac<I, Null>

  2. 0.01 → BFrac<O, BFrac<I, Null>>(O 是 0 的 Bit 实现)

  3. 0.101 → BFrac<I, BFrac<O, BFrac<I, Null>>>

这些结构都会实现 NonZeroBinFrac,因为它们最终递归终止于 BFrac<I, Null>。

四、总结

  • 这段代码定义了一个 类型级二进制小数系统,确保所有合法的小数部分都能被正确构造。

  • 它使用递归 trait 实现来约束合法的结构:

    • 基础情况:0.1(BFrac<I, Null>)。

    • 递归情况:0.xxxx(更高位的小数)。

  • 这种设计常用于 类型安全的数值计算,例如在编译期确保小数部分的合法性。

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

相关文章:

  • 【Canvas与旗帜】圆角蓝底大黄白星十一红白带旗
  • UE破碎Chaos分配模型内部面材质
  • CentOS7编译安装GCC
  • 【Python 高频 API 速学 ④】
  • Spring学习笔记:Spring AOP入门以及基于Spring AOP配置的深入学习与使用
  • 嵌入式软件工程师笔试题(二)
  • 腾讯COS云存储入门
  • 原创邮件合并Python工具使用说明(附源码)
  • 安装NodeJS和TypeScript简要指南
  • 东方心绣脸启幕26周年盛典:以匠心锚定百年基业
  • 百度网盘自动启动如何关闭,关闭智能看图
  • AI推理的“灵魂五问”:直面2025算力鸿沟与中国的破局之路
  • 模拟人脑处理文本——从分句到分词,从段落到时间线叙事
  • 【Datawhale AI夏令营】让AI读懂财报PDF(多模态RAG)(Task 2)
  • 《汇编语言:基于X86处理器》第12章 复习题和练习
  • 《励曼旋耕》Liman Rotary Tillage
  • 202506 电子学会青少年等级考试机器人五级器人理论真题
  • JVM相关(AI回答)
  • 云渲染的未来已来:渲酷云如何重新定义数字内容生产效率
  • [CUDA] CUTLASS | C++ GEMM内核--高度模板化的类
  • 基于STM32H5的循环GPDMA链表使用
  • C语言指针完全指南:从入门到精通
  • C++虚函数表实现机制以及用C语言对其进行的模拟实现(加入了自己的思考和笔记)
  • 轻松Linux-5.进程控制
  • Linux文件系统基石:透彻理解inode及其核心作用
  • 复现论文关于3-RPRU并联机器人运动学建模与参数优化设计
  • 智慧农业-无人机视角庄稼倒伏农作物倒伏识别分割数据集labelme格式541张1类别
  • java基础(六)jvm
  • 12. “static关键字是什么意思”,Java中是否可以覆盖(override)一个private或者是static的方法
  • drippingblues靶机