rust實戰系列十二:浮點類型

Rust提供了基于IEEE 754-2008標準的浮點類型。按占據空間大小區分,分別為 f32和f64,其使用方法與整型差別不大。浮點數字面量表示方式有如下幾種:
輸出結果為:

let f1 = 123.0f64;
let f2 = 0.1f64;
let f3 = 0.1f32;
let f4 = 12E+99_f64;
let f5 : f64 = 2.;
// type f64
// type f64
// type f32
// type f64 科學計數法 // type f64
與整數類型相比,Rust的浮點數類型相對復雜得多。浮點數的麻煩之處在于: 它不僅可以表達正常的數值,還可以表達不正常的數值。
在標準庫中,有一個std::num::FpCategory枚舉,表示了浮點數可能的狀 態:
enum FpCategory {
Nan,
Infinite,
Zero,
Subnormal,
Normal,
}
其中Zero表示0值、Normal表示正常狀態的浮點數。其他幾個就需要特別解釋 一下了。
在IEEE 754標準中,規定了浮點數的二進制表達方式:x=(-1)^s*(1+M) *2^e。其中s是符號位,M是尾數,e是指數。尾數M是一個[0,1)范圍內的二進制 表示的小數。以32位浮點為例,如果只有normal形式的話,0表示為所有位數全0, 則最小的非零正數將是尾數最后一位為1的數字,就是(1+2^(-23)) *2(-127),而次小的數字為(1+2(-22))*2^(-127),這兩個數字的差距為 2(-23)*2(-127)=2^(-150),然而最小的數字和0之間的差距有 (1+2(-23))*2(-127),約等于2^(-127),也就是說,數字在漸漸減少到0 的過程中突然降到了0。為了減少0與最小數字和最小數字與次小數字之間步長的突 然下跌,subnormal規定:當指數位全0的時候,指數表示為-126而不是-127(和指 數為最低位為1一致)。然而公式改成(-1)s*M*2e,M不再+1,這樣最小的數 字就變成2(-23)*2(-126),次小的數字變成2(-22)*2(-126),每兩個相 鄰subnormal數字之差都是2(-23)*2(-126),避免了突然降到0。在這種狀態 下,這個浮點數就處于了Subnormal狀態,處于這種狀態下的浮點數表示精度比 Normal狀態下的精度低一點。我們用一個示例來演示一下什么是Subnormal狀態的 浮點數:
fn main() {
// 變量 small 初始化為一個非常小的浮點數
let mut small = std::f32::EPSILON;
// 不斷循環,讓 small 越來越趨近于 0,直到最后等于0的狀態 while small > 0.0 {
small = small / 2.0;
println!(“{} {:?}”, small, small.classify());
}
}
編譯,執行,發現循環幾十次之后,數值就小到了無法在32bit范圍內合理表達 的程度,最終收斂到了0,在后面表示非常小的數值的時候,浮點數就已經進入了 Subnormal狀態。
Infinite和Nan是帶來更多麻煩的特殊狀態。Infinite代表的是“無窮大”,Nan代表 的是“不是數字”(not a number)。

什么情況會產生“無窮大”和“不是數字”呢?舉例說明:
fn main() {
let x = 1.0f32 / 0.0;
let y = 0.0f32 / 0.0;
println!(“{} {}”, x, y);
}
編譯執行,打印出來的結果分別為inf NaN。非0數除以0值,得到的是inf,0除 以0得到的是NaN。
對inf做一些數學運算的時候,它的結果可能與你期望的不一致:
fn main() {
let inf = std::f32::INFINITY;
println!(“{} {} {}”, inf * 0.0, 1.0 / inf, inf / inf);
}
NaN 0 NaN
NaN這個特殊值有個特殊的麻煩,主要問題還在于它不具備“全序”的特點。示 例如下:
fn main() {
let nan = std::f32::NAN;
println!(“{} {} {}”, nan < nan, nan > nan, nan == nan);
}
false false false
這就很麻煩了,一個數字可以不等于自己。因為NaN的存在,浮點數是不具 備“全序關系”(total order)的。關于“全序”和“偏序”的問題,本節就不展開講解 了,后面講到trait的時候,再給大家介紹PartialOrd和Ord這兩個trait。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696405.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696405.shtml

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

相關文章

歐拉回路和歐拉路徑

在一張圖中&#xff0c;從一個點出發每條邊經過且只經過一次得到的路徑&#xff0c;如果最后回到起點&#xff0c;那么就是歐拉回路&#xff0c;如果最后沒有回到起點&#xff0c;那么得到的就是歐拉路徑。 在無向圖中&#xff0c;歐拉路徑滿足的要求是&#xff0c;除了起點和…

DM數據庫學習之路(十六)DEM部署DM8DPC集群

DEM部署DPC集群 DPC準備工作 在所有安裝DPC服務器上部署dmagent&#xff0c;dmagent的運行環境需要依賴JAVA環境&#xff0c;JAVA版本必須為JAVA1.8。 創建用戶 所有安裝DPC服務器&#xff0c;手工建dmdba用戶 # groupadd dinstall # useradd -g dinstall -d /home/dmdba…

并發編程之深入理解Java線程

并發編程之深入理解Java線程 線程基礎知識 線程和進程 進程 程序由指令和數據組成、但這些指令要運行&#xff0c;數據要讀寫&#xff0c;就必須要將指令加載至CPU、數據加載至內存。在指令運行過程中還需要用到磁盤、網絡等設備。進程就是用來加載指令、管理內存、管理IO的…

Jmeter內置變量 vars 和props的使用詳解

JMeter是一個功能強大的負載測試工具&#xff0c;它提供了許多有用的內置變量來支持測試過程。其中最常用的變量是 vars 和 props。 vars 變量 vars 變量是線程本地變量&#xff0c;它們只能在同一線程組內的所有線程中使用&#xff08;線程組內不同線程之間變量不共享&#…

模型轉換案例學習:等效替換不支持算子

文章介紹 Qualcomm Neural Processing SDK &#xff08;以下簡稱SNPE&#xff09;支持Caffe、ONNX、PyTorch和TensorFlow等不同ML框架的算子。對于某些特定的不支持的算子&#xff0c;我們介紹一種算子等效替換的方法來完成模型轉換。本案例來源于https://github.com/quic/qidk…

并發編程(2)基礎篇-管程

4 共享模型之管程 本章內容 共享問題synchronized線程安全分析Monitorwait/notify線程狀態轉換活躍性Lock 4.1 共享帶來的問題 4.1.1 小故事 老王&#xff08;操作系統&#xff09;有一個功能強大的算盤&#xff08;CPU&#xff09;&#xff0c;現在想把它租出去&#xff…

基礎小白快速入門Python->Python中的類

什么是類&#xff1f; 在編程語言中&#xff0c;類&#xff08;Class&#xff09;是一個用于創建對象的藍圖或模板。它定義了對象的屬性&#xff08;也稱為成員變量&#xff09;和方法&#xff08;也稱為成員函數&#xff09;。類是面向對象編程&#xff08;OOP&#xff09;的…

2024 全國水科技大會暨第二屆智慧水環境管理與技術創新論壇

論壇二&#xff1a;第二屆智慧水環境管理與技術創新論壇 召集人&#xff1a;劉炳義 武漢大學智慧水業研究所所長、教授 為貫徹落實中共中央國務院印發《數字中國建設整體布局規劃》和國務院關于印發《“十四五”數字經濟發展規劃》的通知&#xff0c;推動生態環境智慧治理&…

L2 清點代碼庫----PTA(疑問)

上圖轉自新浪微博&#xff1a;“阿里代碼庫有幾億行代碼&#xff0c;但其中有很多功能重復的代碼&#xff0c;比如單單快排就被重寫了幾百遍。請設計一個程序&#xff0c;能夠將代碼庫中所有功能重復的代碼找出。各位大佬有啥想法&#xff0c;我當時就懵了&#xff0c;然后就掛…

docker pullpush 生成鏡像文件并push 到阿里云

pull docker docker pull ultralytics/ultralytics # 拉取yolov8的鏡像倉庫 docker run -it ultralytics/ultralytics # 運行鏡像 conda create -n gsafety python3.8 # 創建環境 source activate gsafety # 激活環境 pip install -i https://pypi.tuna.tsinghua.edu.cn/simp…

糖尿病性視網膜病變(DR)的自動化檢測和分期

糖尿病性視網膜病變&#xff08;DR&#xff09;的自動化檢測和分期 提出背景DR的階段及其特征 歷年解法計算機視覺方法多分類方法 新的解法深度學習方法遷移學習大模型多模型集成全流程分析 總結特征1&#xff1a;圖像分割特征2&#xff1a;疾病分級特征3&#xff1a;治療建議生…

開源模型應用落地-工具使用篇-獲取文本向量(五)

一、前言 在之前學習的"開源模型應用落地-工具使用篇"系列文章中&#xff0c;我們已經學會了如何使用向量數據庫。然而&#xff0c;還有一個問題一直未解決&#xff0c;那就是如何處理文本向量。在本文中&#xff0c;我們將繼續深入學習關于向量的知識&#xff0c;特…

Redis的哨兵系統

Redis 哨兵&#xff08;Sentinel&#xff09;系統是一種用于管理多個 Redis 服務器的系統&#xff0c;其主要目標是提供監控、通知、自動故障轉移和服務發現功能。哨兵系統能夠在 Redis 實例出現問題時自動進行故障轉移&#xff0c;確保系統的高可用性。其工作原理如下&#xf…

常見消息中間件

ActiveMQ 我們先看ActiveMQ。其實一般早些的項目需要引入消息中間件&#xff0c;都是使用的這個MQ&#xff0c;但是現在用的確實不多了&#xff0c;說白了就是有些過時了。我們去它的官網看一看&#xff0c;你會發現官網已經不活躍了&#xff0c;好久才會更新一次。 它的單機吞…

2024年學習的最高薪酬編程語言

2024年學習的最高薪酬編程語言 10. Scala Scala是一種在Java虛擬機&#xff08;JVM&#xff09;上運行的函數式編程語言。它通常用于大數據處理、機器學習和后端Web開發。 關于Scala編程語言及其常見用途的要點如下&#xff1a; Scala是一種通用編程語言&#xff0c;運行在J…

mac真的安裝不了vmware嗎 mac如何安裝crossover crossover序列號從哪里買 購買正版渠道

有些用戶可能想在mac上運行一些只能在windows上運行的軟件&#xff0c;比如游戲、專業軟件等。這時候&#xff0c;就需要用到虛擬機技術&#xff0c;也就是在mac上安裝一個可以模擬其他操作系統的軟件&#xff0c;比如vmware或者crossover。那么&#xff0c;mac真的安裝不了vmw…

2024年華為OD機試真題-貪心歌手-Python-OD統一考試(C卷)

題目描述: 一個歌手準備從A城去B城參加演出。 1) 按照合同,他必須在T天內趕到。 3) 歌手不能往回走。 4) 每兩座城市之間需要的天數都可以提前獲知。 5) 歌手在每座城市都可以在路邊賣唱賺錢。經過調…

【前端素材】推薦優質后臺管理系統Xoric平臺模板(附源碼)

一、需求分析 當我們從多個層次來詳細分析后臺管理系統時&#xff0c;可以將其功能和定義進一步細分&#xff0c;以便更好地理解其在不同方面的作用和實際運作。 1. 功能層次 a. 用戶管理功能&#xff1a; 用戶注冊和登錄&#xff1a;管理用戶賬戶的注冊和登錄過程。權限管…

K8S故障處理指南:網絡問題排查思路

1. 前言 對于私有化環境&#xff0c;客戶的網絡架構&#xff0c;使用的云平臺存在著各種差異&#xff0c;K8S網絡可能會出現各種問題&#xff0c;此文著重講解遇到此種問題的排查方法和思路&#xff0c;不會涉及相關網絡底層技術描述. 環境說明 由于我們的k8s網絡組件默認使…

5.網絡游戲逆向分析與漏洞攻防-游戲網絡架構逆向分析-測試需求與需求拆解

內容參考于&#xff1a;易道云信息技術研究院VIP課 上一個內容&#xff1a;模擬游戲登陸器啟動游戲并且完成注入 首先正常分析軟件程序有沒有漏洞&#xff0c;需要通過它的操作侵入&#xff0c;比如買東西&#xff0c;就通過買東西的按鈕它背后有源代碼就看源代碼&#xff0c…