【unitrix】 4.1 类型级加一操作(Add1.rs)

一、原码

这段代码实现了一个类型级的加一操作(Add1 trait),用于在Rust的类型系统中进行数值加一运算。

//! 加一操作特质实现 / Increment operation trait implementation
//!
//! 说明:
//!     1. Z0、P1,、N1 + 1,常规计算
//!     2. B0<H> + 1,该位B1,无进位,原高位是N1时要规范格式,即H=N1时要特化,此时源码为B0<N1>
//!     3. B1<H> + 1,该位B0,有进位,当H+1 = Z0时要规范格式,即H=N1时要特化,此时源码为B1<N1>,不是简化格式use crate::number::{NonNegOne, NonZero, Primitive, Var, B0, B1, N1, P1, Z0, FixedPoint, Float};
/// 加一特质 / Increment trait
/// 
/// 为类型系统提供加一操作的计算能力
/// Provides increment operation capability for type system
pub trait Add1 {/// 加一后的输出类型 / Output type after incrementtype Output;fn add1(self) -> Self::Output;
}// ========== 基础类型实现 / Basic Type Implementations ==========/// Z0 (0) 加一实现 / Increment for Z0 (0)
/// 
/// 0 + 1 = 1 (B1<Z0>)
impl Add1 for Z0 {type Output = P1;  //P1替换B1<Z0>#[inline(always)]fn add1(self) -> Self::Output{P1::new()}
}/// P1 (1) 加一实现 / Increment for P1 (+1)
/// 
/// 1 + 1 = 2 (B0<P1>)
impl Add1 for P1 {type Output = B0<P1>;#[inline(always)]fn add1(self) -> Self::Output{B0::new()}
}/// N1 (-1) 加一实现 / Increment for N1 (-1)
/// 
/// -1 + 1 = 0 (Z0)
impl Add1 for N1 {type Output = Z0;#[inline(always)]fn add1(self) -> Self::Output{Z0::new()}
}// ========== 递归类型实现 / Recursive Type Implementations ==========/// B0<H> 加一实现 / Increment for B0<H>
/// 
/// 直接加一无需进位 / Direct increment without carry
/// ...0 + 1 = ...1 / ...0 + 1 = ...1
impl<H:NonZero + NonNegOne> Add1 for B0<H>{type Output = B1<H>;#[inline(always)]fn add1(self) -> Self::Output{B1::new()}
}/// B1<H> 加一实现 / Increment for B1<H>
/// 
/// 处理进位情况 / Handles carry case
/// 0...1 + 1 = 0...(高位进位) / ...1 + 1 = ...0(with carry)
impl<H:NonZero + NonNegOne + Add1<Output: NonZero>> Add1 for B1<H>{//P1替代B1<Z0>后,H不可能为Z0type Output = B0<H::Output>;#[inline(always)]fn add1(self) -> Self::Output{B0::new()}
}// 待Float加法完善后考虑其加一实现
/* impl<Mantissa, Exponent> Add1 for Float<Mantissa, Exponent> {type Output = <Float<Mantissa, Exponent> as Add<P1>>::out;#[inline(always)]fn add1(self) -> Self::Output{Float::new()}
} */
// ========== 特化实现 ==========
/// B0<N1> (-2) 加一特化实现 / Specialized increment for B0<N1> (-2)
impl Add1 for B0<N1> {type Output = N1;#[inline(always)]fn add1(self) -> Self::Output{N1::new()}
}// B1<N1> (-1) 加一特化实现,本身不允许B1<N1>出现,其结果也是不规范的格式,目前取消
/* impl Add1 for B1<N1> {type Output = Z0;
} *//// Val<T> 加一实现 / Increment for Val<T>
/// Val<T>
impl<T:Primitive + From<P1>> Add1 for Var<T> {type Output = Self;#[inline(always)]fn add1(self) -> Self::Output{Self(self.0 + T::from(P1))}
}// ==============================================
// FixedPoint的Add1实现
// ==============================================impl<IntPart: Add1, FracPart> Add1 for FixedPoint<IntPart, FracPart>{type Output = FixedPoint<IntPart::Output, FracPart>;fn add1(self) -> Self::Output {FixedPoint::new()}
}

二、核心设计

Add1 Trait 定义

pub trait Add1 {type Output;fn add1(self) -> Self::Output;
}

定义了一个泛型trait,表示类型可以执行加一操作,Output关联类型表示加一后的结果类型。

三、基础类型实现

Z0 (0) 加一

impl Add1 for Z0 {type Output = P1;  // 0 + 1 = 1fn add1(self) -> Self::Output { P1::new() }
}
  • Z0表示0,加一后变为P1(1)
P1 (1) 加一

impl Add1 for P1 {type Output = B0<P1>;  // 1 + 1 = 2 (二进制10)fn add1(self) -> Self::Output { B0::new() }
}
  • P1表示1,加一后变为B0(二进制10,即2)
N1 (-1) 加一

impl Add1 for N1 {type Output = Z0;  // -1 + 1 = 0fn add1(self) -> Self::Output { Z0::new() }
}
  • N1表示-1,加一后变为Z0(0)

四、复合类型实现

B0 (以0结尾的二进制数) 加一

impl<H: NonZero + NonNegOne> Add1 for B0<H> {type Output = B1<H>;  // ...0 + 1 = ...1fn add1(self) -> Self::Output { B1::new() }
}
  • 将最低位的B0变为B1,不需要进位

  • 例如:B0(2) + 1 = B1(3)

B1 (以1结尾的二进制数) 加一

impl<H: NonZero + NonNegOne + Add1<Output: NonZero>> Add1 for B1<H> {type Output = B0<H::Output>;  // ...1 + 1 = ...0 (有进位)fn add1(self) -> Self::Output { B0::new() }
}
  • 将最低位的B1变为B0,并向高位进位

  • 例如:B1(3) + 1 = B0<B0>(4)

五、特殊处理

B0 (-2) 加一

···rust

impl Add1 for B0 {
type Output = N1; // -2 + 1 = -1
fn add1(self) -> Self::Output { N1::new() }
}
···

  • 特化处理负数情况,保持格式规范
    
  • B0<N1>表示-2,加一后变为N1(-1)
    
定点数(FixedPoint)实现

···rust

impl<IntPart: Add1, FracPart> Add1 for FixedPoint<IntPart, FracPart> {
type Output = FixedPoint<IntPart::Output, FracPart>;
fn add1(self) -> Self::Output { FixedPoint::new() }
}
···
+ 定点数的加一只对整数部分进行加一操作

+ 小数部分保持不变+ 例如:FixedPoint<P1, B1<Z0>>(1.5) + 1 = FixedPoint<B0<P1>, B1<Z0>>(2.5)

六、特点

+ 类型安全:所有操作都在编译期进行类型检查+ 零成本抽象:运行时无额外开销+ 递归处理:复合类型的加一操作递归处理每一位+ 特殊化处理:对边界情况(如负数)有特殊处理

这个实现通过在类型系统层面定义数值运算,可以在编译期捕获更多错误,特别适合需要高安全性和确定性的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910353.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git工作中常用

1.管理本地文件 git init//初始化生成一个本地仓库 git add * //添加到暂存区 git commit–m “message” //提交到本地仓库 2.删除本地分支 git branch -d local_branch_name3.隐藏及解除隐藏 git stashgit stash pop4.远程新建分支&#xff0c;在本地签出时候怎么看到 …

Golang 中接口嵌套的详细说明和使用示例

在 Go 语言中&#xff0c;接口嵌套&#xff08;也称为接口组合&#xff09;是一种强大的特性&#xff0c;它允许你通过组合现有接口来创建新的接口。这种方式遵循了 Go 的组合优于继承的设计哲学。 接口嵌套的基本概念 接口嵌套是指在一个接口中嵌入其他接口&#xff0c;从而…

数智管理学(二十四)

第二章 数智化重塑管理的核心 第三节 动态资源配置与实时优化 在当今数智化浪潮的席卷下&#xff0c;企业管理面临着前所未有的变革与挑战。资源配置作为企业管理的核心环节之一&#xff0c;其方式和效率直接影响着企业的运营成本、生产效率和市场竞争力。传统的静态资源配置…

Redis 各版本差异及性能测试指标对比

Redis 各版本差异及性能测试指标对比 Redis 主要版本差异 Redis 2.x 系列 主要特性&#xff1a; 支持主从复制支持简单的持久化(RDB和AOF)发布/订阅功能事务支持 局限性&#xff1a; 单线程模型集群功能有限 Redis 3.x 系列 重大改进&#xff1a; 引入Redis Cluster(官方…

Python图形化秒表:使用Turtle打造精确计时工具

⏱️ 编程基础第一期《6-30》–简易计时器/秒表&#xff0c;这是一个使用Python的turtle和time模块实现的简易计时器/秒表程序&#xff0c;提供简洁的数字时间显示。 目录 &#x1f31f; 功能特点&#x1f680; 使用方法&#x1f9e9; 程序架构设计&#x1f4bb; 代码详解窗口和…

【轨物方案】轨物科技|LoRaWAN 赋能智能光伏清扫,解锁电站高效运维新时代

在大型集中式光伏电站的广袤土地上&#xff0c;清扫机器人的高效运行是保障发电效率的关键。然而&#xff0c;传统的无线通信方式在这些偏远、无4G/5G信号覆盖的区域&#xff0c;往往步履维艰。作为专注于工业物联网解决方案的轨物科技&#xff0c;我们深知这些痛点&#xff0c…

Python函数实战:从基础到高级应用

Python-函数 Python 中可以使用def关键字来定义函数。 函数定义规则&#xff1a; 函数代码块以 def 关键词开头&#xff0c;后接函数标识符名称和圆括号 ()。任何传入参数和自变量必须放在圆括号中间&#xff0c;圆括号之间可以用于定义参数。函数的第一行语句可以选择性地使…

Mac在局域网中突然很慢(包括SMB、NFS、SCP、SSH、Ping等场景均很慢)

今天 SMB 又突然好慢&#xff0c;大概只有 8-9 MB/s&#xff0c;而苹果 SMB 很容易突然很慢是出了名的。我就想装 NFS&#xff0c;但是 NFS 弄好之后还是很慢&#xff0c;我服了&#xff0c;我就检查了scp等场景&#xff0c;都很慢&#xff0c;但是互联网下载速度还是很快的。 …

UMAP:用于降维的均匀流形近似和投影实验

关键词&#xff1a; Uniform Manifold Approximation and Projection (UMAP)&#xff1a;均匀流形近似与投影 一、说明 对于降维&#xff0c;首先看数据集是否线性&#xff0c;如果是线性的用pca降维&#xff1b;如果是非线性数据&#xff0c;t-SNE或者UMAP&#xff0c;本文针…

【Datawhale组队学习202506】YOLO-Master task03 IOU总结

系列文章目录 task01 导学课程 task02 YOLO系列发展线 文章目录 系列文章目录前言1 功能分块1.1 骨干网络 Backbone1.2 颈部网络 Neck1.3 头部网络 Head1.3.1 边界框回归头1.3.2 分类头 2 关键概念3 典型算法3.1 NMS3.2 IoU 总结 前言 Datawhale是一个专注于AI与数据科学的开…

Spring IOC容器核心揭秘:BeanFactory创建、配置加载解析并注册为BeanDefinition

文章目录 一、为何这个阶段如此重要&#xff1f;二、整体流程全景图三、源码级深度解析1. BeanFactory的诞生源码入口&#xff1a;refresh()方法核心方法&#xff1a;obtainFreshBeanFactory()核心实现&#xff1a;refreshBeanFactory()BeanFactory实例化 2. ★ 核心&#xff1…

解锁n8n:开启工作流自动化的无限可能(5/6)

文章摘要&#xff1a;n8n 是一款开源低代码工作流自动化平台&#xff0c;通过可视化拖放节点创建复杂工作流&#xff0c;无需大量代码。具有强大集成能力、数据转换、错误处理等功能&#xff0c;适用于数据同步、客户关系管理、IT 自动化等场景。相比 Zapier、IFTTT 等工具&…

数据赋能(308)——合作共享——数据交流

概述 重要性如下&#xff1a; 信息准确性&#xff1a;数据交流原则确保在数据传递过程中信息的准确性&#xff0c;这是决策和业务活动的基础。决策支持&#xff1a;准确的数据交流为决策提供有力支持&#xff0c;帮助组织做出更明智的决策。业务效率&#xff1a;有效的数据交…

TCP流量控制与拥塞控制:核心机制与区别

一、TCP流量控制&#xff08;Flow Control&#xff09; 定义&#xff1a;通过调节发送方的发送速率&#xff0c;确保接收方能够及时处理数据&#xff0c;避免缓冲区溢出。 本质&#xff1a;解决发送方与接收方之间的"端到端"速率匹配问题。 1. 实现机制&#xff1a…

iOS多端兼容性调试:一次iOS性能优化分工具协作排查过程

在多技术栈混合开发日益普及的今天&#xff0c;iOS应用中越来越多地集成了WebView、Flutter、React Native甚至小程序模块。而这些模块带来的复杂性&#xff0c;不仅体现在UI适配&#xff0c;还包括数据同步、系统权限管理、线程调度等方面的问题。 本文记录的是我们在处理一个…

秋招Day14 - MySQL - 索引

索引为什么能够提高MySQL的查询效率&#xff1f; 索引可以理解为目录&#xff0c;通过索引可以快速定位数据&#xff0c;避免全表扫描 一般是B树结构&#xff0c;查找效率是O(log n)。 索引还能加速排序、分组、连接等操作。 create index idx_name on students(name); 能简…

第5天:LSTM预测火灾温度

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 复用LSTM模型实现火灾温度预测 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &am…

目标检测之YOLOV11自定义数据使用OBB训练与验证

一、前置条件与环境准备 在开始训练前&#xff0c;确保已完成以下准备《目标检测之YOLOV11自定义数据预处理——从原始标注到YOLO-OBB格式转换与验证》&#xff1a; 数据目录结构&#xff1a; yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程进阶一(Labview与OPC UA设备通信)

1.Labview与OPC UA设备通信 OPC UA通信协议优势显著,具体表现如下: 跨平台兼容:支持多种操作系统和硬件平台,实现无缝数据交换。高安全性:内置加密、身份验证和授权机制,确保数据传输安全。高效数据交换:采用二进制编码和优化的传输协议,提高通信效率。复杂数据建模:…

【Comsol教程】如何求解指定范围的积分 或 在积分中去除奇异点/异常值

我们在Comsol中经常需要对物体的边界求积分&#xff0c;比如求物体在流场中所受的总流体牵引力&#xff0c;又或者是物体在电场中受到的总介电泳力。当物体的材料或者边界条件存在突变时&#xff0c;物体表面的粘性应力或者麦克斯韦电应力可能会存在异常值。通常解决方法有细化…