C/C++浮點數在內存中的存儲方式

1、內存表示spa

任何數據在內存中都是以二進制的形式存儲的,浮點數的表示是把一個數的有效數字和數的範圍在計算機的一個存儲單元中分別予以表示,數的小數點位置隨比例因子的不一樣而在必定範圍內自由浮動。以下圖是32位和64位浮點數的表示方法:blog

image       image

在介紹浮點數的存儲方式以前咱們先介紹下階碼和尾數。內存

階碼:表達指數部分,用整數形式表示,指明小數點在數據中的位置,決定浮點數的表示範圍。get

尾數:用定點小數表示,給出有效數字的位數決定了浮點數的表示精度。it

理論上,一個十進制數N能夠寫成N=10e×M,一個R進制數N能夠寫成N=Re×M,(M 尾數,e 指數,R 基數)例如:156.78=15.678×101=1.5678×102= 0.15678×103=RE×M,那麼計算機中究竟採用哪一種數據形式呢?二進制

對於二進制數
1011.1101 =0.10111101 ×2+4
方法

= 10.111101 ×2+2 im

= 1.0111101 ×2+3 (規格化表示法)數據

= 1.0111101 ×2+11 (11表示二進制的3)(規格化表示法)異常

=RE×M

根據IEEE754標準,規格化表示原則以下。

一、尾數最高有效位爲1,隱藏,而且隱藏在小數點的左邊(即:1≤M<2)

二、32位單精度浮點數規格化表示x=(-1)s×(1.M)×2E-127

   e=E-127(E=e+127)

三、64位雙精度浮點數規格化表示x=(-1)s ×(1.M)×2E-1023

   e=E-1023(E=e+1023)

指數真值e 用偏移碼形式表示爲階碼E。

例1:浮點機器數(41360000)16,求真值。

①十六進制數展開成二進制數

0 100 0001 0011 0110 0000 0000 0000 0000

S(1位) 階碼E(8位)  尾數M(23位)

②指數e=階碼-127 =1000 0010-01111111=00000011=(3)10

③包括隱藏位1的尾數1.M =1.011011

④X=(-1)s×1.M×2e=+(1.011011)×23=+1011.011=(11.375)10

例2:真值20.59375,求32位單精度浮點數。

①分別將整數和分數部分轉換成二進制數。

20.59375=10100.10011

②移動小數點,使其在第一、2位之間。

10100.10011=1.010010011×24

e=4

S=0

E=4+127=131=10000011

M=010010011

③獲得32位浮點數的二進制存儲格式爲:

01000001101001001100000000000000=(41A4C000)16

 

2、表示範圍

32位單精度浮點數表示範圍:

E=1(0000 0001)~254(1111 1110) E全爲1是用來通知異常狀況。

e=-126~+127

表達的數據範圍(絕對值):

最小值:e=-126,M=0(1.M=1)

十進制表達:2-126≈1.18×10-38

最大值:e=127,M=11…1(23個1)

1.M=1.11…1(23個1)=2-2-23

十進制表達:(2-2-23)×2127≈2×2127≈3.40×1038

 

64位單精度浮點數表示範圍:

E=1~2046  E全爲1是用來通知異常狀況。

e=-1022~+1023

表達的數據範圍(絕對值):

最小值:e=-1022,M=0(1.M=1)

十進制表達:2-1022≈2.23×10-308

最大值:e=1023,M=11…1(52個1)

1.M=1.11…1 (52個1)=2-2-52

十進制表達:(2-2-52)×21023≈ 2×21023≈1.79×10308

相關文章
相關標籤/搜索