【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
英文地址,請注明出處:http://en.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;物體表面的粘性應力或者麥克斯韋電應力可能會存在異常值。通常解決方法有細化…