【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.pswp.cn/web/88418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88418.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UI前端與數字孿生結合實踐案例:智慧零售的庫存管理優化系統

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構零售庫存的 “人 - 貨 - 場” 協同在零售行業利潤率持續承壓的背景…

【Freertos實戰】零基礎制作基于stm32的物聯網溫濕度檢測(教程非常簡易)持續更新中.........

本次記錄采用Freertos的第二個DIY作品&#xff0c;基于Onenet的物聯網溫濕度檢測系統&#xff0c;此次代碼依然是全部開源。通過網盤分享的文件&#xff1a;物聯網溫濕度檢測.rar 鏈接: https://pan.baidu.com/s/1uj9UURVtGE6ZB6OsL2W8lw?pwdqm2e 提取碼: qm2e 大家也可以看看…

Matplotlib-多圖布局與網格顯示

Matplotlib-多圖布局與網格顯示一、多圖布局的核心組件二、基礎布局&#xff1a;plt.subplots()快速創建網格1. 均等分網格2. 不等分網格&#xff08;指定比例&#xff09;三、進階布局&#xff1a;GridSpec實現復雜嵌套1. 跨行列布局2. 嵌套GridSpec四、實用技巧&#xff1a;布…

GitHub上優秀的開源播放器項目介紹及優劣對比

ExoPlayer 項目地址:https://github.com/google/ExoPlayer 特點: 由Google開發,支持廣泛的視頻格式和流媒體傳輸協議,如DASH、HLS、SmoothStreaming。 提供靈活的媒體源架構和高級特性,如動態自適應流播放。 開發者可以輕松擴展和定制播放器組件,適應特定需求。 優點: 功…

react打包發到線上報錯Minified React error #130

開發過程中遇到一個問題&#xff0c;記錄一下 本地打包發布正常&#xff0c;發測試環境正常&#xff0c;可是通過Jenkins打包發布線上報錯 報錯信息 index-67fbbd81.js:39 Error: Minified React error #130; visit https://reactjs.org/docs/error-decoder.html?invariant130…

微服務項目遠程調用時的負載均衡是如何實現的?

負載均衡概述 負載均衡是微服務架構中的核心組件&#xff0c;用于將請求合理分配到多個服務實例上&#xff0c;提高系統的可用性和性能。負載均衡的分類 負載均衡大致可以分為兩類 1. 服務端負載均衡 實現位置&#xff1a;獨立部署的負載均衡服務器&#xff08;位于客戶端和服務…

【中文核心期刊推薦】中國農業科技導報

《中國農業科技導報》是中國科技核心期刊&#xff0c;也是北京大學圖書館“中文核心期刊要目總覽”收錄的期刊。它是由中國農村技術開發中心主辦&#xff0c;全面為科教興農服務的綜合性農業學術期刊。&#xfeff;《中國農業科技導報》是中國農業科學院生物技術研究所承辦的&a…

php 如何通過mysqli操作數據庫?

在PHP中&#xff0c;mysqli&#xff08;MySQL Improved Extension&#xff09;是操作MySQL數據庫的擴展庫&#xff0c;提供了面向對象和過程式兩種風格。以下是mysqli的基本操作方法&#xff1a; 1. 連接數據庫 面向對象風格 $mysqli new mysqli(localhost, username, passwor…

c/c++拷貝函數

memcpy()函數概要原型void * memcpy ( void * dest, const void * src, size_t num );功能memcpy()會復制 src 所指的內存內容的前 num 個字節到 dest所指的內存地址上&#xff08;memcpy()并不關心被復制的數據類型&#xff0c;只是逐字節地進行復制&#xff0c;這給函數的使用…

HTTP核心基礎詳解(附實戰要點)

目錄 一圖勝千言&#xff1a;HTTP核心機制圖解?編輯 一、HTTP本質&#xff1a;通信的橋梁 二、五大核心特性解析 三、HTTP頭部&#xff1a;隱藏的控制中心 四、連接管理&#xff1a;性能關鍵點 開發者必知實踐技巧 一圖勝千言&#xff1a;HTTP核心機制圖解 一、HTTP本質…

華為靜態路由配置

問題描述&#xff1a;針對兩臺筆記本和兩個路由器在不同的網段場景中&#xff0c;對兩個路由器進行靜態路由配置。下面以如下場景為例&#xff0c;介紹詳細配置過程。配置步驟&#xff1a; 1、對每個路由器的接口下配置IP地址 [huawei]interface gx/x/x [huawei-interface]ip a…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第八課——圖像數據的行緩存

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程文件請關注…

經典排序算法

文章目錄前言1. 排序的基本概念1.1 排序是什么&#xff1f;1.2 常見的排序算法概覽2. 常見排序算法的實現2.1 插入排序 (Insertion Sort)2.1.1 基本思想2.1.2 直接插入排序2.1.3 希爾排序 (Shell Sort)2.2 選擇排序 (Selection Sort)2.2.1 直接選擇排序2.2.2 堆排序 (Heap Sort…

RabbitMQ 消息隊列:從入門到Spring Boot實戰

RabbitMQ 作為一款開源的、基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;協議實現的消息代理&#xff0c;憑借其強大的功能、靈活的路由機制以及出色的性能&#xff0c;在業界得到了廣泛的應用。無論是處理高并發訂單、異步通知、日志收集還是系統解耦&…

代賬行業數字化破局:從“知道”到“做到”,三步走穩贏!

認知&#xff01;降本&#xff01;增收&#xff01;數字化&#xff01;——這不僅是口號&#xff0c;更是代賬行業在激烈競爭和時代變化中生存發展的關鍵。很多代賬同行其實都明白趨勢&#xff0c;也知道大概該怎么做。但問題卡在第一步&#xff1a;不知道怎么開始&#xff0c;…

Mac 電腦crontab執行定時任務【Python 實戰】

1、crontab -e 編輯定時任務列表 crontab -e查看當前定時任務列表,長按 i 編輯,編輯完之后按 esc 退出編輯,然后輸入:wq 保存并提出。 如下: (base) charles@zl ~ % crontab -e58 15 * * * /Library/Frameworks/Python.framework/Versions/3.8/bin/python3 /Users/charle…

go go go 出發咯 - go web開發入門系列(三) 項目基礎框架搭建與解讀

go go go 出發咯 - go web開發入門系列&#xff08;三&#xff09; 項目基礎框架搭建與解讀 往期回顧 go go go 出發咯 - go web開發入門系列&#xff08;一&#xff09; helloworldgo go go 出發咯 - go web開發入門系列&#xff08;二&#xff09; Gin 框架實戰指南 前言 如…

【字節跳動】數據挖掘面試題0014:SQL中count(1), count(*), count(列)區別

文章大綱SQL 中 count(1)、count(*)、count(某列) 的區別一、核心定義與行為差異二、示例說明差異三、性能差異與優化四、適用場景建議五、面試應答要點六、索引掃描與全表掃描1. 索引掃描的觸發條件2. 全表掃描的適用場景3. 常見面試問題點Q1&#xff1a;索引掃描一定比全表掃…

Linux面試問題-軟件測試

1、你在上一家公司常用的Linux命令有哪些&#xff1f;答&#xff1a;使用vim/vi編輯文件&#xff0c;使用cat&#xff0c;more,less&#xff0c;head查看文件&#xff0c;使用grep過濾日志中的error,使用ps查看進程&#xff0c;使用top查看實時進程&#xff0c;netstat查看端口…

時序數據庫的存儲之道:從數據特性看技術要點

時序數據的獨特挑戰時序數據(Time-Series Data)是指按時間順序記錄的一系列數據點&#xff0c;在物聯網、金融、工業監控等領域無處不在。與傳統數據相比&#xff0c;時序數據具有幾個鮮明特點&#xff1a;時間導向性&#xff1a;每個數據點都帶有精確的時間戳高寫入量&#xf…