計算機如何存儲浮點數

浮點數組成

在計算機中浮點數通常由三部分組成:符號位、指數位、尾數位。IEEE-754中32位浮點數如下:
32bit浮點數組成
上圖32bit浮點數包含1bit的符號位,8比特的指數位和23bit的尾數位。對于一個常規浮點數,我們來看看它是如何存儲和計算的。這里以浮點數25.125為例。這個浮點數分為整數(25(d))和小數部分(0.125(d)),(下面25(d)中d表示十進制,后續b表示二進制)
于是:
25 ( d ) = 11001 ( b ) 0.125 ( d ) = 0.001 ( b ) 25.125 ( d ) = 11001.001 ( b ) = 1.1001001 E 4 ( b ) \begin{align*} 25(d)&=11001(b)\\ 0.125(d)&=0.001(b)\\ 25.125(d)&=11001.001(b)=1.1001001E^{4}(b) \end{align*} 25(d)0.125(d)25.125(d)?=11001(b)=0.001(b)=11001.001(b)=1.1001001E4(b)?
明顯這個數是一個正數,所以我們可以得知符號位S=0。指數位的計算和我們想象的稍微有點區別,這里我們的2禁止指數位是4。在十幾種考慮的指數位可能是負數,為了避免負數情況,我們可以將指數表達范圍移動一個偏置到正數區域。因為我們的指數位位8bit,有符號整數最高能表示 2 7 ? 1 = 127 2^7-1=127 27?1=127,所以對指數位偏移一個127即可得到正數。所以我們的指數位部分為: 4 ( d ) + 127 ( d ) = 131 ( d ) = 10000011 ( b ) 4(d)+127(d)=131(d)=10000011(b) 4(d)+127(d)=131(d)=10000011(b)。接下來是尾數,因為 25.125 ( d ) = 11001.001 ( b ) 可以為 1.1001001 E 4 ( b ) 也可以為 . 11001001 E 5 ( b ) 25.125(d)=11001.001(b)可以為1.1001001E^{4}(b)也可以為.11001001E^{5}(b) 25.125(d)=11001.001(b)可以為1.1001001E4(b)也可以為.11001001E5(b)這樣我們就得到了不同的表示方法。為了確保總是用相同的方法表示浮點數,IEEE-754中要求了表示尾數的部分總是為1.xxx。正因如此,我們這里的指數部分才是4而不是5。也正是因為如此,所以我們只需要保存.xxx即可,因為小數點前一定是1,這樣能節省一個bit。尾數部分為1001001,這樣我們的浮點數在內存中表示為:01000001110010010000000000000000。這個值如果是32有符號的定點數int32他應該表示的為:1103691776。
0 10000011 10010010000000000000000

代碼驗證

#include <cstdint>
#include <iomanip>
#include <iostream>
#include <limits>using namespace std;
// 定義一個聯合體用于訪問浮點數的內存表示
union FloatBits {float f;uint32_t bits;
};// 打印浮點數的二進制表示
void printFloatBits(float value) {FloatBits fb;fb.f = value;std::cout << "Float value: " << std::fixed << std::setprecision(6) << value<< std::endl;std::cout << "Binary representation: ";// 從最高位開始逐位打印for (int i = 31; i >= 0; --i) {// 通過位掩碼檢查每一位的值uint32_t mask = 1 << i;std::cout << ((fb.bits & mask) ? '1' : '0');// 在輸出中添加空格分組if (i % 8 == 0)std::cout << ' ';}std::cout << std::endl;
}int main() {float number = 25.125f;int a = 1103691776;float *b = reinterpret_cast<float *>(&a);int zp = 0;            // 00000000000000000000000000000000int zn = -2147483648;  // 10000000000000000000000000000000int infn = -8388608;   // 11111111100000000000000000000000int infp = 2139095040; // 01111111100000000000000000000000int nan = 2139095041;  // 01111111100000000000000000000001float inf_float = -std::numeric_limits<float>::infinity();std::cout << "-inf float for int  " << *reinterpret_cast<int *>(&inf_float)<< " -inf float = " << inf_float << "\n";float *zero_pos = reinterpret_cast<float *>(&zp);float *zero_neg = reinterpret_cast<float *>(&zn);float *infn_f = reinterpret_cast<float *>(&infn);float *infp_f = reinterpret_cast<float *>(&infp);float *nan_f = reinterpret_cast<float *>(&nan);printFloatBits(number);std::cout << "a = " << a << " *b = " << *b << " number = " << number<< " +0 => " << *zero_pos << " -0 =>" << *zero_neg << " +inf => "<< *infp_f << " -inf => " << *infn_f << " nan => " << *nan_f<< "\n";return 0;
}

使用GDB驗證存儲變量:
在這里插入圖片描述

x/4tb:

  • 4 :表示4個后面的元素
  • t:表示打印為二進制
  • b:打印單位為byte(8bit)。

你可能會感到疑惑為什么這個值看起來和我們的結果不太一樣,這是因為我們的機器使用小端存儲法。show endian可以打印當前運行機器上是大端存儲還是小端存儲法。實際的二進制按照高位字節存儲在低位的方式存儲。所以這個值作為二進制,我們應該反向理解為:0100000 111001001 00000000 00000000。同理你可以試一試打印變量a,你就會發現兩著結果完全相同。盡管二進制上完全相同,但是因為用了不同的類型符修飾運算的時候依然能知道這個數是表示浮點數的25.125還是無符號整數的1103691776。

浮點數的特殊值

  1. E不全為0或不全為1。這時,浮點數就采用偏置表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1。
  2. E全為0。這時,浮點數的指數E等于1-127(或者1-1023(64bit)),有效數字M不再加上第一位的1,而是還原為0.xxxxxx的小數。這樣做是為了表示±0,以及接近于0的很小的數字。
  3. E全為1。這時,如果有效數字M全為0,表示±無窮大(正負取決于符號位s);如果有效數字M不全為0,表示這個數不是一個數(NaN)(111111111000000000000000000000000(b))

如何計算負數的二進制

  1. 找到對應的正數(8388608),計算二進制(00000000100000000000000000000000)。
  2. 反轉所有位,得到二進制的反碼(11111111011111111111111111111111)。
  3. 反碼+1得到二進制的補碼(111111111000000000000000000000000)。

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

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

相關文章

conda env pip install error:No space left on device

conda 環境 pip install error&#xff1a;No space left on device 文章目錄 conda 環境 pip install error&#xff1a;No space left on device現象1 實驗2 分析和解決辦法 現象 非root用戶的服務器&#xff0c;需要安裝環境&#xff0c;安裝的環境超過2GB sudo pip insta…

醫療機器人中的具身智能進展——自主超聲策略模型的任務編碼和局部探索

醫療機器人一直是具身智能的研究熱點。醫學圖像、醫療觸診、血壓血氧、心率脈搏和生物電信號等多模態生物醫學信息&#xff0c;不斷豐富著醫療機器人的感知范疇。 自主超聲 “自主超聲”屬于具身智能醫療機器人領域中話題度較高的研究方向。作為臨床檢查的重要手段之一&#…

線性系統理論及應用GUI設計及仿真

目錄 1.控制系統的狀態空間模型 1.1.狀態空間模型 1.2 傳遞函數模型 1.3 傳遞函數轉換為狀態空間模型 1.4.狀態空間模型轉換為傳遞函數 1.5.狀態空間模型轉化為約當標準型 2.線性系統的時域分析 2.1.矩陣指數函數的計算 2.2.線型定常連續系統的狀態空間模型求解 3.線…

ubuntu24.04按關鍵字卸載不需要的apt包

使用的時候發現一個imagemagic無法正常讀取文件&#xff0c;試圖卸載 man apt經過嘗試后&#xff0c;發現list的一個神奇關鍵字&#xff0c;用來顯示已安裝的軟件包 sudo apt list --installed | grep image按image關鍵字過濾&#xff1a; 之后按軟件名卸載即可 sudo apt pu…

開關電源——調制模式和工作模式

一、開關電源的調制模式 開關電源作為一種廣泛應用于電子設備中&#xff0c;用于將一定電壓和電流轉換為另一種電壓和電流的技術&#xff0c;以下是開關電源三種常見的調制模式&#xff1a; 脈沖寬度調制&#xff08;Pulse Width Modulation&#xff09; 脈沖頻率調制&#xff…

上升與下降

目錄 開頭程序程序的流程圖關于上升與下降的動畫(程序的效果)結尾 開頭 大家好&#xff0c;我叫這是我58。今天&#xff0c;我們要來看一個關于上升與下降的動畫和這個動畫相關的內容。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #define HIGH 10 #include <stdio.h> #…

高德地圖 key 和安全密鑰使用

參考高德地圖&#xff1a;JS API 安全密鑰使用 高德地圖 key 和安全密鑰使用 一、通過明文方式設置參數查看如下成功后返回的信息 二、通過代理服務器轉發實驗&#xff1a;通過本地地址轉發返回錯的錯誤信息&#xff0c;如下通過正確的項目的的服務地址&#xff0c;返回正常參數…

【VUE基礎】VUE3第一節—vite創建vue3工程

什么是VUE Vue (發音為 /vju?/&#xff0c;類似 view) 是一款用于構建用戶界面的 JavaScript 框架。它基于標準 HTML、CSS 和 JavaScript 構建&#xff0c;并提供了一套聲明式的、組件化的編程模型&#xff0c;幫助你高效地開發用戶界面。無論是簡單還是復雜的界面&#xff0…

Java+MySQL8.0.36+ElementUI數字化產科信息管理系統之”五色管理”

JavaMySQL8.0.36ElementUI數字化產科信息管理系統之”五色管理” 一、數字化產科信息管理系統概述 數字化產科信息管理五色管理是一種基于孕產婦妊娠風險的分類管理方法&#xff0c;通過數字化手段實現孕產婦全周期的健康風險評估與管理。該方法將孕產婦按照風險等級分為綠色、…

DC-DC充放電原理

文章目錄 前言1. 電子器件1.1 電容1.2 電感 2. 升壓電路3. 降壓電路4. 電壓均衡電路4.1 被動均衡4.2 主動均衡 5. 我的疑問5.1 對于升壓電路&#xff0c;怎么設計升壓到多少V后&#xff0c;停止升壓&#xff1f;5.2 什么是等效電阻&#xff1f;5.3 快充是如何實現的&#xff1f…

紅外遙控:智能學習紅外遙控編碼

家用電器如電視、機頂盒、空調等都可以通過紅外遙控&#xff0c;Rainbow專為物聯網、家居智能而設計的硬件&#xff0c;自然在紅外遙控收發方面有很好的支持。 紅外遙控通常是由紅外發光二極管發射一定頻率的載波&#xff0c;通過載波攜帶的控制信息&#xff0c;經過調制的信號…

LightGlue: Local Feature Matching at Light Speed【文獻閱讀】

論文&#xff1a;LightGlue: Local Feature Matching at Light Speed 代碼&#xff1a;https://github.com/cvg/LightGlue 作者&#xff1a;1 ETH Zurich__2 Microsoft Mixed Reality & AI Lab Abstract 提出的LightGlue是一個深度神經網絡用于學習圖像間的局部特征匹配。…

back-end developer 后端開發的一些常識

通俗易懂版 1. 通信協議 1.1 RPC (Remote Procedure Call) 客觀解釋&#xff1a; RPC是一種協議&#xff0c;允許程序通過網絡在不同的計算機上調用函數&#xff0c;就像調用本地函數一樣。RPC隱藏了網絡通信的復雜性&#xff0c;使得遠程服務調用看起來像是本地調用。 現實…

WAIC | 上海人形機器人創新中心 | 最新演講 | 詳細整理

前言 筆者看了7月4號的人形機器人與具身智能發展論壇的直播&#xff0c;并在7月5日到了上海WAIC展會現場參觀。這次大會的舉辦很有意義&#xff0c;聽并看了各家的最新成果&#xff0c;拍了很多照片視頻&#xff0c;部分演講也錄屏了在重復觀看學習 稍后會相繼整理創立穹徹智…

算法系列--分治排序|歸并排序|逆序對的求解

一.基本概念與實現 歸并排序(mergeSort)也是基于分治思想的一種排序方式,思路如下: 分解:根據中間下標mid將數組分解為兩部分解決:不斷執行上述分解過程,當分解到只有一個元素時,停止分解,此時就是有序的合并:合并兩個有序的子區間,所有子區間合并的結果就是原問題的解 歸并…

第一節 網絡安全概述

一.網絡空間安全 網絡空間&#xff1a;一個由信息基礎設施組成相互依賴的網絡。 ---- 海陸空天&#xff08;大海、陸 地、天空、航天&#xff09; 通信保密階段 ---- 計算機安全 ----- 信息系統安全 ----- 網絡空間安全 計算機安全&#xff1a;開始秉持著“嚴于律己&#x…

C語言 指針和數組—指針數組及其在字符串處理中的應用

目錄 問題的提出 問題的解決 回頭看——指針、數組及其他類型的混合 指針數組與指向數組的指針 字符串的排序 問題的提出 問題的解決 回頭看——指針、數組及其他類型的混合 ? 基本數據類型 ? int 、 long 、 char 、 short 、 float 、 double…… ? 數組是一種從…

os.makedirs

官方說明文檔&#x1f517;&#xff1a;Link 解釋下面的代碼&#xff1a; os.makedirs(os.path.join(args.output_dir,sample_images), exist_okTrue)os.makedirs()&#xff1a;這是一個用于遞歸創建目錄的Python函數。如果中間級目錄&#xff08;目錄鏈中的所有目錄&#xff…

The IsA relationship and HasA relationship

Why you should worry about that? or not. Is-A (Inheritance) Represents an “is-a-kind-of” hierarchy between classes. A subclass (child class) inherits attributes and methods from its superclass (parent class). Subclasses can specialize or override inh…

設計模式之模版方法

模版方法介紹 模版方法&#xff08;Template Method&#xff09;模式是一種行為型設計模式&#xff0c;它定義了一個操作&#xff08;模板方法&#xff09;的基本組合與控制流程&#xff0c;將一些步驟&#xff08;抽象方法&#xff09;推遲到子類中&#xff0c;使得子類可以在…