C語言第二十九彈---浮點數在內存中的存儲

?個人主頁:?熬夜學編程的小林

💗系列專欄:?【C語言詳解】?【數據結構詳解】

目錄

1、浮點數在內存中的存儲

1.1、練習

1.2、浮點數怎么轉化為二進制

1.3、浮點數的存儲

1.3.1、浮點數存的過程

1.3.2、浮點數取的過程

1.3、題目解析

總結


1、浮點數在內存中的存儲

常見的浮點數:3.14159、1E10(1^10)等,浮點數家族包括: float double long double 類型。
浮點數表示的范圍: float.h 中定義

1.1、練習

#include <stdio.h>
int main()
{int n = 9;float *pFloat = (float *)&n;printf("n的值為:%d\n",n);printf("*pFloat的值為:%f\n",*pFloat);*pFloat = 9.0;printf("num的值為:%d\n",n);printf("*pFloat的值為:%f\n",*pFloat);return 0;
}
輸出什么?
按照我們整數存儲的想法,打印的結果分別是9、9.000000、9、9.000000

但是為什么會出現上面的結果呢?下面就從浮點數的存儲來詳細講解此代碼。

1.2、浮點數怎么轉化為二進制


首先我們來個簡單的例子:

把十進制小數5.25化為二進制小數,我們應該怎么操作?
我們分為以下幾步:

1. 以小數點為界進行拆分;
2. 整數部分轉為二進制相信大家肯定沒問題
3. 小數部分采用的是"乘2取整法",當乘2之后小數部分得到0就停止計算

十進制小數5.25:

1、以小數點為界進行拆分,整數部分為5,小數部分為0.25

2、整數轉化為二進制為101

3、小數部分采取“乘2取整法”,0.25*2=0.5,整數部分為0,小數部分為0.5,繼續乘2,0.5*2=1.0,整數部分為1,小數部分為0,小數部分為0則停止計算。取的數字為整數部分數字,因此轉化為二進制小數為0.01。

4. 合并結果:整數部分 + 小數部分,最終得到二進制結果為101.01.

5. 二進制小數轉化為十進制驗算

101.01=1*2^2+0*2^1+1*2^0+0*2^-1+1*2^-2=5.25

以上就是浮點數化為二進制的步驟了,下面我們來看看更復雜一點的例子:
把十進制3.14化為二進制:

1、以小數點為界進行拆分,整數部分為3,小數部分為0.14

2、整數轉化為二進制為11

3、小數部分采取“乘2取整法”,0.14*2=0.28,整數部分為0,小數部分為0.28,繼續乘2, 0.28*2=0.56,整數部分為0,小數部分為0.56,繼續乘2, 0.56*2=1.12,整數部分為1,小數部分為0.12,繼續乘2, 0.12*2=0.24,整數部分為0,小數部分為0.24,.............小數部分為0則停止計算。取的數字為整數部分數字。

1.3、浮點數的存儲

上面的代碼中, num *pFloat 在內存中明明是同?個數,為什么浮點數和整數的解讀結果會差別這么大?
要理解這個結果,?定要搞懂浮點數在計算機內部的表示方法。
根據國際標準IEEE(電氣和電子?程協會) 754,任意?個?進制浮點數V可以表示成下面的形式:
V ? = ?(?1) ^S *?M ? 2^E
? (?1)^S 表示符號位,當S=0,V為正數;當S=1,V為負數
? M 表示有效數字,M是大于等于1,小于2的
? 2^E 表示指數位
舉例來說:
?進制的5.0,寫成?進制是 101.0 ,相當于 1.01×2^2
那么,按照上面V的格式,可以得出S=0,M=1.01,E=2。
?進制的-5.0,寫成?進制是 -101.0 ,相當于 -1.01×2^2 。那么,S=1,M=1.01,E=2。
IEEE 754規定:
對于32位的浮點數,最高的1位(第一位)存儲符號位S,接著的8位存儲指數E,剩下的23位存儲有效數字M。
對于64位的浮點數,最高的1位(第一位)存儲符號位S,接著的11位存儲指數E,剩下的52位存儲有效數字M。

1.3.1、浮點數存的過程

IEEE 754 對有效數字M和指數E,還有?些特別規定。
前面說過, 1 M<2 ,也就是說,M可以寫成 1.xxxxxx 的形式,其中 xxxxxx 表示小數部分。
IEEE 754 規定,在計算機內部保存M時默認這個數的第?位總是1因此可以被舍去,只保存后面的 xxxxxx部分。比如保存1.01的時候,只保存01,等到讀取的時候,再把第?位的1加上去。這樣做的目的,是節省1位有效數字。以32位浮點數為例,留給M只有23位,將第?位的1舍去以后,等于可以保存24位有效數字。
至于指數E,情況就比較復雜。
首先,E為?個無符號整數(unsigned int)。
這意味著,如果E為8位,它的取值范圍為0~255;如果E為11位,它的取值范圍為0~2047。但是,我們知道,科學計數法中的E是可以出現負數的,所以IEEE 754規定, 存入內存時E的真實值必須再加上?個中間數 ,對于8位的E,這個中間數是127;對于11位的E,這個中間數是1023。比如,2^10的E是10,所以保存成32位浮點數時,必須保存成10+127=137,即10001001。

1.3.2、浮點數取的過程

指數E從內存中取出還可以再分成三種情況:
E不全為0或不全為1
這時,浮點數就采用下面的規則表示,即 指數E的計算值減去127(或1023) ,得到真實值,再將 有效數字M前加上第?位的1。
比如:0.5 的?進制形式為0.1,由于規定正數部分必須為1,即將小數點右移1位,則為1.0*2^(-1),其階碼為-1+127(中間值)=126,表示為01111110,而尾數1.0去掉整數部分為0,補齊0到23位 00000000000000000000000,則其?進制表示形式為:
0 01111110 00000000000000000000000
E全為0
這時,浮點數的指數E等于1-127(或者1-1023)即為真實值,有效數字M不再加上第?位的1,而是還原為0.xxxxxx的小數。這樣做是為了表示±0,以及接近于0的很小的數字。
0 00000000 00100000000000000000000
E全為1
這時,如果有效數字M全為0,表示±無窮大(正負取決于符號位s);
0 11111111 00010000000000000000000
好了,關于浮點數的表示規則,就說到這里。

1.3、題目解析

下面,讓我們回到?開始的練習
先看第1環節,為什么 9 還原成浮點數,就成了 0.000000
9以整型的形式存儲在內存中,得到如下?進制序列:
0000 0000 0000 0000 0000 0000 0000 1001
首先,將 9 的?進制序列按照浮點數的形式拆分,得到第?位符號位s=0,后面8位的指數
E=00000000 , 最后23位的有效數字M=000 0000 0000 0000 0000 1001。
由于指數E全為0,所以符合E為全0的情況。因此,浮點數V就寫成:
V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)
顯然,V是?個很小的接近于0的正數,所以用十進制小數表示就是0.000000。
再看第2環節,浮點數9.0,為什么整數打印是 1091567616?
首先,浮點數9.0 等于?進制的1001.0,即換算成科學計數法是:1.001×2^3
所以: 9.0? = ?(?1) ^0?? (1.001)? ? ?2^3
那么,第?位的符號位S=0,有效數字M等于001后面再加20個0,湊滿23位,指數E等于3+127=130, 即10000010
所以,寫成?進制形式,應該是S+E+M,即
0 10000010 001 0000 0000 0000 0000 0000
這個32位的?進制數,被當做整數來解析的時候,就是整數在內存中的補碼,此數為正數,原反補碼相同,原碼正是 1091567616
通過浮點數進行存儲,按照浮點數打印,因此*pFloat=9.000000。

總結


本篇博客就結束啦,謝謝大家的觀看,如果公主少年們有好的建議可以留言喔,謝謝大家啦!

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

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

相關文章

FPGA領域頂級學術會議

FPGA領域頂級學術會議主要有FPGA,FCCM,FPL和FPT。 1 FPGA 會議全名是: ACM/SIGDA International Symposium on Field-Programmable Gate Arrays 網站是:https://dl.acm.org/conference/fpga FPGA常年在美國舉辦,每年2月,偏FPGA基礎研究; 該會議的論文免費下載。這個比…

【MATLAB源碼-第144期】基于matlab的蝴蝶優化算法(BOA)無人機三維路徑規劃,輸出做短路徑圖和適應度曲線。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 ?蝴蝶優化算法&#xff08;Butterfly Optimization Algorithm, BOA&#xff09;是基于蝴蝶覓食行為的一種新穎的群體智能算法。它通過模擬蝴蝶個體在尋找食物過程中的嗅覺導向行為以及隨機飛行行為&#xff0c;來探索解空間…

vue3前端項目開發,具備純天然的防止爬蟲采集的特征

vue3前端項目開發,具備純天然的防止爬蟲采集的特征&#xff01;眾所周知&#xff0c;網絡爬蟲可以在網上爬取到一些數據&#xff0c;很多公司&#xff0c;為了自己公司的數據安全&#xff0c; 尤其是web端項目&#xff0c;不希望被爬蟲采集。那么&#xff0c;您可以使用vue技術…

spark ui的job數,stage數以及task數

背景 我們在查看spark ui的界面時&#xff0c;一段spark sql的執行經常看到會有對應有幾個job&#xff0c;然后每個job又有幾個stage&#xff0c;而每個stage又有好多個task&#xff0c;那么這些job,stage,task是怎么和spark 算子對應的呢 算子和job數,stage數以及task數的對…

代碼隨想錄算法訓練營29期|day59 任務以及具體安排

第九章 動態規劃part16 583. 兩個字符串的刪除操作 // dp數組中存儲word1和word2最長相同子序列的長度 class Solution {public int minDistance(String word1, String word2) {int len1 word1.length();int len2 word2.length();int[][] dp new int[len1 1][len2 1];for …

Gartner信息圖:2024 年44種安全和風險管理技術采用路線圖

Gartner發布的該信息圖確定了全球企業正在采用的 44 種安全相關技術&#xff0c;并根據采用階段、部署風險和企業價值對它們進行了映射。安全和風險管理領導者可以使用此信息圖將他們的技術投資與同行進行比較。 2024 年安全和風險管理技術采用路線圖 SRM 領導者可以使用此信息…

世微AP8P059 靜態功耗小 太陽能人體紅外線感應IC

概述 AP8P059 是一款集成低壓 LDO 、光 控、充電控制、過充保護、欠壓保護、 PIR 感應、延時為一體的人體感應太陽能 LED 燈控制芯片&#xff0c;只需要很少的外接元件&#xff0c;適 用于鋰電池供電的 PIR 人體感應 LED 燈具 的應用。 外置的一級帶通增益放大 器便…

Python實現視頻轉音頻、音頻轉文本的最佳方法

文章目錄 Python實現視頻轉音頻和音頻轉文字視頻轉音頻步驟 1&#xff1a;導入moviepy庫步驟 2&#xff1a;選擇視頻文件步驟 3&#xff1a;創建VideoFileClip對象步驟 4&#xff1a;提取音頻步驟 5&#xff1a;保存音頻文件 音頻轉文字步驟 1&#xff1a;導入SpeechRecognitio…

RV新聞概要 --- 2024/02/23

來源&#xff1a;https://mp.weixin.qq.com/s/EEJVLQnXvgQTbtU_yrW9lw 晶心科技是一家上市公司&#xff08;TWSE&#xff1a;6533&#xff1b;SIN&#xff1a;US03420C2089&#xff1b;ISIN&#xff1a;US03420C1099&#xff09;&#xff0c;已有18 年的經營歷史&#xff0c;是…

單向循環鏈表的操作

main函數&#xff1a; #ifndef __loopLinkList_H__#define __loopLinkList_H__typedef int datatype;union msg{ //若數據的類型也為int&#xff0c;則不需要這個聯合體datatype data;int len; //放頭結點&#xff0c;記錄鏈表長度};typedef struct node{union msg te…

Istio實戰:Istio Kiali部署與驗證

目錄 前言一、Istio安裝小插曲 注意事項 二、Kiali安裝三、Istio測試參考資料 前言 前幾天我就開始搗騰Istio。前幾天在執行istioctl install --set profiledemo -y 的時候老是在第二步就報錯了&#xff0c;開始我用的istio版本是1.6.8。 后面查看k8s與istio的版本對應關系后發…

vCenter、vSphere Client硬盤擴容詳解

文章目錄 1、需求2、vSphere 操作流程3、服務器操作3.1、查看分區空間大小3.2、列出所有可用塊設備的信息3.3、新建分區3.4、重讀分區表信息3.5、格式化分區信息3.6、查看卷組的詳細狀態3.7、創建物理卷3.8、擴容卷組3.9、邏輯卷在線擴容3.10、顯示物理卷屬性3.11、XFS 文件系統…

最少停車數(C 語言)

題目描述 特定大小的停車場&#xff0c;數組cars[]表示&#xff0c;其中1表示有車&#xff0c;0表示沒車。車輛大小不一&#xff0c;小車占一個車位&#xff08;長度1&#xff09;&#xff0c;貨車占兩個車位&#xff08;長度2&#xff09;&#xff0c;卡車占三個車位&#xf…

Rollup + Ts

Rollup Ts RollupTs demo 一、文件配置 | - src | | - utils | | | - .ts | | - .babelrc | | - main.js | | - style.css | - package.json | - rollup.config.js | - tsconfig.json二、插件下載 rollup // rollup 基本的包 typescript // ts 包 rollup/plug…

如何做bug分析 ?bug分析什么 ? 為什么要做bug分析 ?

每當我們完成一個版本測試時&#xff0c;總會在測試報告中添加一些分析bug的指標 &#xff0c;主要用于分析在測試過程中存在的問題 。但是在分析的過程中你就可能遇到如下的問題 &#xff1a; 我應該分析那些指標呢 &#xff1f;每一個具體的指標該如何分析 &#xff1f;它能說…

Vue3學習——computed、watch、watchEffect

computed 與Vue2.x中computed配置功能一致寫法 import {computed} from vuesetup(){...//計算屬性——簡寫let fullName computed(()>{return person.firstName - person.lastName})//計算屬性——完整let fullName computed({get()return person.firstName - perso…

算法——模擬

1. 什么是模擬算法&#xff1f; 官方一點來說 模擬算法&#xff08;Simulation Algorithm&#xff09;是一種通過模擬現實或抽象系統的運行過程來研究、分析或解決問題的方法。它通常涉及創建一個模型&#xff0c;模擬系統中的各種事件和過程&#xff0c;以便觀察系統的行為&a…

Redis緩存一致性問題(自用記錄)

背景 在開發過程中&#xff0c;redis緩存技術被大范圍應用。由于現在的系統大多是分布式的&#xff0c;高并發的&#xff0c;redis和傳統的數據庫&#xff0c;存在數據不一致的問題。 解決方案 本文主要探討兩者數據不一致的解決方案&#xff1a; 給緩存設置過期時間&#x…

dell戴爾電腦靈越系列Inspiron 15 3520原廠Win11系統中文版/英文版

Dell戴爾筆記本靈越3520原裝出廠Windows11系統包&#xff0c;恢復出廠開箱預裝OEM系統 鏈接&#xff1a;https://pan.baidu.com/s/1mMOAnvXz5NCDO_KImHR5gQ?pwd3nvw 提取碼&#xff1a;3nvw 原廠系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、Office辦公軟件、MyD…

Jmeter接口測試 ,這應該是全網最詳細的教程了

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 關注公眾號【互聯網雜貨鋪】&#xff0c;回復 1 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 一、Jmeter 的使用步驟 打開Jmeter 安裝包&#xff0c;進入\bi…