① 什麼是單精度和雙精度浮點數
單精度與雙精度的區別:
1、單精度,也就是 float ,在 32 位機器上用 4 個位元組來存儲的;而雙精度double是用 8 個位元組來存儲的。
2,單精度和雙精度在計算機中的表示格式雖一樣,但由於位數存儲位不同,他們能表示的數值的范圍就不同,也就是能准確表示的數的位數就不同。
拓展資料:
單精度
單精度數是指計算機表達實數近似值的一種方式。VB中Single(單精度浮點型)變數存儲為 IEEE 32 位(4 個位元組)浮點數值的形式,它的范圍在負數的時候是從 -3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45 到 3.402823E38 。
雙精度浮點數
雙精度浮點數(double)是計算機使用的一種數據類型,使用 64 位(8位元組) 來存儲一個浮點數。 它可以表示十進制的15或16位有效數字,其可以表示的數字的絕對值范圍大約是:2.23x10-308~ 1.79x10308。IEEE754為其定製標准。
② IEEE754標准: 二, 32位浮點數的取值范圍
這是"IEEE754標准系列"的第二篇文章. 主要討論32位浮點數 (或者說float類型) 的取值范圍到底是如何計算出來的.
本章主要參考自 IEEE754 wiki
這里先直接給出維基上的取值范圍:
可見float類型, 或者說32位浮點數的取值范圍是 :
或者說是:
直觀表示的話就是:
[-, -0.] ∪ [0., ]
在詳細介紹這個范圍是怎麼計算出來的之前, 我們必須先了解一些概念.只有了解了這些概念, 才能真正的理解浮點數的取值范圍是如何計算出來的.
而且此處假定你已經對IEEE754浮點數在內存中的存儲方式有所了解, 還不了解的話也可以參考本系列的第一篇文章.
那這就開始吧
根據IEEE754的規定, 按照尾數位隱藏的整數部分是 1. 還是 0. 可以將浮點數劃分為兩類: normal number(規格數) 和 subnormal number(非規格數)
下面以32位浮點數為例來解釋這些概念.
normal number(規格數)
就是尾數位隱藏的整數部分是 1. 的數, 這種數叫做normal number, 可以理解為"正常的數"
一般來說, 我們遇到的都是normal number
舉例: 20.5在內存中表示為: 0 1000 0011 0100 1000 0000 0000 000
其中尾數部分(即上面的加粗部分), 去掉後面補的零之後為: 01001
但事實上, 真實的尾數部分應該是: 1. 01001, 即前面省略了整數部分 1.
subnormal number(非規格數)
尾數位隱藏的整數部分為 0. 的數, 叫做subnormal number, 也叫作denormal number, 可以理解為"低於正常數的數"
引入subnormal number這個概念, 是為了在浮點數下溢時, 可以逐位的損失精度, 以盡可能精確的表達0附近的極小數, 之後的章節會具體講解.
為了表示subnormal number, IEEE754規定: 如果將指數位全部填充為0, 則表示這個數是個subnormal number
舉例: 以32位浮點數為例, 當你看到類似於 * 00000000 *********************** 這樣內存狀態的數時, (即指數位全部為0的數), 就應該知道, 這是個subnormal number, 此時這個數的尾數位隱藏的整數不是 1. 而是 0.
和subnormal number類似, IEEE754對於指數位全為1的狀態也做了特殊規定:
當指數位全部被1填充, 即指數位表示的值為255時, 用於表示這個浮點數處在一種非正常數(non-number)的狀態: 即這個數可能是±infinity或NaN.
注: Infinity和NaN是兩個特殊數, 分別表示 無窮 和 Not a Number. 我們後文還會詳細討論這兩個特殊數
所以: 當你看到類似於 * 11111111 *********************** 這樣內存狀態的數時, (即指數位全部為1的數), 就應該知道, 這是個non-number, 它用於表示特殊數.
在了解了上面兩個概念之後, 再看計算方法就很簡單了.
如上所述, IEEE754規定, 當指數位全部為0或者全部為1時, 用於表示兩種特殊狀態的數: subnormal number 和 non-number, 所以現在可以得到如下示意圖, 以32位單精度浮點數為例:
這就是理解單精度浮點數取值范圍的關鍵: 當我們討論浮點數的取值范圍時, 實際上討論的是: normal number (上圖中綠色部分)的范圍.
可以看出, 32位浮點數的 指數部分 其實是無法取到-127和128的, 因為:
用於表示 -127 的 0000 0000 被用來表示 subnormal number 了,
而用於表示 128 的 1111 1111 被用來表示 non-number 了.
所以實際上32位浮點數的指數部分只能取到只能取到[-126, 127]
再來看看尾數: 對於normal number, 尾數前隱藏的整數部分始終保持為 1.
所以尾數(含隱藏的整數部分)所表示的值的范圍其實是 [1.00...00, 1.11...11],
這個二進制數, 約等於十進制的[1, 2), 因為1.11..11非常逼近十進制的2
好啦, 現在我們知道, 對於32位flaot而言: 尾數(含隱藏的整數部分)的可取值為: [1 ,2), 指數位可取值[-126, 127], 且浮點數可正可負, 根據運算規則, 就不難算出32位float的取值范圍了:
取值范圍
注意開閉區間哦
然後為了看著順眼, 我們把上式的以2為底, 替換為以10為底:
↑ 轉換後小數位太長了, 所以這里寫成了省略號的形式: 3.402823669 ...
從上面這個集合中, 取一個更容易表示的子集, 就是我們常見的32位float的取值范圍了:
↑ 注意, 上面這個集合其實是32位float取值范圍的子集, 不過和真正的取值范圍也沒有差太多, 表示起來也更簡潔, 沒有冗長的小數位, 還能寫成閉區間的形式...所以在各種資料中, 我們常看到的取值范圍就是上面這個.
↑ 之所以能寫成 閉 區間的形式, 就是因為它只是真正取值范圍的一個 子集. 這里特意說明一下, 防止有的同學對這里的閉區間感到困惑.
下面是 32位單精度浮點數的取值范圍示意圖, 可以參照此圖更好的理解一下前文內容
下圖中, x軸代表以2為底的n次冪(即內存中的指數部分), y軸代表尾數(含隱藏的整數部分1.)
坐標系中任意一點(x, y)就代表一個浮點數,
這一點到x軸, y軸所圍成的矩形的面積(即上圖中橙色區域的面積), 就是這個浮點數的值 (即浮點數的值 = 尾數(含隱藏的整數部分) * 以2為底的n次冪)
上圖中:
藍色部分: 表示normal number的取值范圍, 即, normal number類型的浮點數對應的坐標點只能出現在坐標系中的藍色區域.
坐標點: 一個坐標點對應一個浮點數
橙色部分的面積: 表示該浮點數的值.
這就是32位浮點數取值范圍的計算方法.
下一章將詳細介紹為什麼說32位浮點數的精度是"7位有效數", 這個7是怎麼計算出來的, 下一章也將會是整個系列中最有難度, 最重要的一章.
那下一章再見吧~
③ 浮點數的取值范圍用二進製表示的
目前多數系統都按照ieee-754標准來規定浮點數的存儲格式。ieee754規定,單精度浮點數用4位元組存儲,雙精度浮點數用8位元組存儲,分為三個部分:符號位、階碼和尾數。階碼即指數,尾數即有效小數位數。單精度格式階碼佔8位,尾數佔24位,符號位1位,雙精度則為11位階碼,53位尾數和1位符號位,
顯然差別就出來了。即使都是4位元組存儲的單精度浮點數,還有不使用ieee754標準的,我記得字長32位的大型ibm系列機就是1位符號位,24位尾數,7位階碼,基數16,而不是2,與此標准不同。所以浮點數的表示範圍依賴的因素較多較復雜,主要取決於表示一個浮點數所用的位元組數和階碼的大小與長度。說法不一樣,但應該都是有根據的。
④ 若浮點數點的IEEE-754 標准存儲格式為41D4C000H,求該浮點數的十進制值,要求給出具體過程
[例1]若浮點數x的754標准存儲格式為(41360000)16,求其浮點數的十進制數值.
將16進制展開後,可得二進制數格式為
0 100,0001,0 011,0110,0000,0000,0000,0000
S E M
指數e=100,0001,0-01111111=00000011=(3)10
包含隱藏位1的尾數1.M=1.011,0110,0000,0000,0000,0000
於是有 x=(-1)^0*(1.M)*2^(E-127)
=+(1.011011)2*2^3
=(11.375)10
⑤ 若浮點數x的 十進制真值如下:請求出IEEE754標准存儲格式 1) -3.125
IEEE754 學習總結一:前言二:預備知識三:將浮點格式轉換成十進制數四:將十進制數轉換成浮點格式(real*4)附:IEEE754 Converte 1.0介紹一:前言前不久在分析一個程序的過程中遇到了浮點運算,也就順便學習了一下浮點數的存放格式(IEEE754標准),此文僅作為總結,其中舉了幾個典型的例子,如果你想深入了解IEEE754標准,我想本文並不太適合您.二:預備知識-----------------------------------------------------------------------值 存儲為 指數偏移量real*4 1位符號位(s)、8位指數(e),23位尾數(m,共32位) 127(7FH)real*8 1位符號位(s)、11位指數(e),52位尾數(m,共64位) 1023(3FFH)real*10 1位符號位(s)、15位指數(e),64位尾數(m,共80位) 16383(3FFFH)-----------------------------------------------------------------------計算公式:V=(-1)^s*2^E*M當e(各位)為全'0'時,E=1-(2^(e(位數)-1)-1),;M=m.如:real*4是8位,E=1-(2^(8-1)-1)=1-127=-126即,在real*4時:V=(-1)^s*2^(-126)*m在real*8時:V=(-1)^s*2^(-1022)*m當e(各位)不為全'0'且不為全'1'時,E=e(值)-(2^(e(位數)-1)-1);M=1+m.即,在real*4時:V=(-1)^s*2^(e(值)-127)*(1+m)在real*8時:V=(-1)^s*2^(e(值)-1023)*(1+m)三:將浮點格式轉換成十進制數[例3.1]:0x00280000(real*4)轉換成二進制符號位 指數部分(8位) 尾數部分0 00000000 01010000000000000000000符號位=0;因指數部分=0,則:尾數部分M為m:0.01010000000000000000000=0.3125該浮點數的十進制為:(-1)^0*2^(-126)*0.3125=3.-39[例3.2]:0xC04E000000000000(real*8)轉換成二進制符號位 指數部分(11位) 尾數部分1 10000000100 符號位=1;指數=1028,因指數部分不為全'0'且不為全'1',則:尾數部分M為1+m:1.=1.875該浮點數的十進制為:(-1)^1*2^(1028-1023)*1.875=-60四:將十進制數轉換成浮點格式(real*4)[例4.1]:26.0十進制26.0轉換成二進制11010.0規格化二進制數1.10100*2^4計算指數4+127=131符號位 指數部分 尾數部分0 10000011 10100000000000000000000以單精度(real*4)浮點格式存儲該數0100 0001 1101 0000 0000 0000 0000 00000x41D0 0000[例4.2]:0.75十進制0.75轉換成二進制0.11規格化二進制數1.1*2^-1計算指數-1+127=126符號位 指數部分 尾數部分0 01111110 10000000000000000000000以單精度(real*4)浮點格式存儲該數0011 1111 0100 0000 0000 0000 0000 00000x3F40 0000[例4.3]:-2.5十進制-2.5轉換成二進制-10.1規格化二進制數-1.01*2^1計算指數1+127=128符號位 指數部分 尾數部分1 10000000 01000000000000000000000以單精度(real*4)浮點格式存儲該數1100 0000 0010 0000 0000 0000 0000 00000xC020 0000附:IEEE754 Converte 1.0介紹用IEEE754 Converte 1.0 轉換[例3.2]的截圖
⑥ IEEE754標準的單精度浮點數存儲形式為如下:求其浮點數的十進制真值.
按照IEEE-754標准規定,單精度浮點數用4位元組存儲,分為三個部分:符號位S、階E和尾數D。階即指數,尾數即有效小數位數。單精度格式階佔8位,尾數佔24位(歸一化數據去首位1結果為23位),符號位1位,換算公式為Data = S * 2^(E-127) * (D)。
==>
1100 0001 1110 0000 0000 0000 0000 0000
==>
1位 8位 23位
S E D'(歸一化去1結果)
1 100 0001 1 110 0000 0000 0000 0000 0000
1 1000 0011 110 0000 0000 0000 0000 0000
1 1000 0011 0.110 0000 0000 0000 0000 0000
==>
S E D(補1.還原歸一化結果)
1 1000 0011 1+0.110 0000 0000 0000 0000 0000
1 8 3 1+0.110 0000 0000 0000 0000 0000
==>
二進制小數 0.11B => 十進制 0.5 + 0.25 = 0.75
S E D整數(2進制) D小數(2進制)
1 8 3 1+0.110 0000 0000 0000 0000 0000
1 0x83 1.110 0000 0000 0000 0000 0000
1 0x83 1 + 0.110 0000 0000 0000 0000 0000
1 131 1 + 0.75
1 131 1.75
==》
S E D
1 131 1.75
=>二進制純小數
Data = S * 2^(E-127) * (D)
= (-1) * 2^(131-127) * (1.75)
= (-1) * (2^4) * (1.75)
= -1 * 16 * 1.75
= - 28.0
⑦ IEEE754是什麼
IEEE754代碼
標准表示法
為便於軟體的移植,浮點數的表示格式應該有統一標准(定義)。1985年IEEE(Institute of Electrical and Electronics Engineers)提出了IEEE754標准。該標准規定基數為2,階碼E用移碼表示,尾數M用原碼表示,根據原碼的規格化方法,最高數字位總是1,該標准將這個1預設存儲,使得尾數表示範圍比實際存儲的一位。實數 的IEEE754標準的浮點數格式為:
具體有三種形式:
表3 IEEE754三種浮點數的格式參數
浮點數
類型 存儲位數 偏移值( )
階碼E的取值范圍 真值表達式
數符(s) 階碼(E) 尾數(M) 總位數 十六進制 十進制
短實數 1 8 23 32 7FH 127 1~254
長實數 1 11 52 64 3FFH 1023 1~2046
臨時實數 1 15 64 80 3FFFH 16383 1~32766
對於階碼為0或為255(2047)的情況,IEEE有特殊的規定。
在浮點數總位數不變的情況下,其精度值與范圍值是矛盾的,因此一般的機器都提供有單、雙精度兩種格式。表4中列出了IEEE754單精度浮點數的表示範圍,對於雙精度只需要修改一下偏移值和尾數位數即可。
表4 IEEE754單精度、雙精度浮點數范圍
典型範圍 浮點數代碼 真 值
數符(Ms) 階碼(E) 尾數(M)
最大正數
最小正數
絕對值最大的負數
絕對值最小的負數 0
0
1
1 11111110
00000001
11111110
00000001 11………11
00………00
11………11
00………00
標准浮點數的存儲格式與圖1(b)相似,只是在尾數中隱含存儲著一個1,因此在計算尾數的真值時比一般形式要多一個整數1。對於階碼E的存儲形式因為是 127的偏移,所以在計算其移碼時與人們熟悉的128偏移不一樣,正數的值比用128偏移求得的少1,負數的值多1,為避免計算錯誤,方便理解,常將E當成二進制真值進行存儲。例如:將數值-0.5按IEEE754單精度格式存儲,先將-0.5換成二進制並寫成標准形式:-0.510=-0.12=-1.0×2-12,這里s=1,M為全0,E-127=-1,E=12610=011111102,則存儲形式為:
1 01111110 000000000000000000000000=BE00000016
這里不同的下標代表不同的進制。
⑧ 若浮點數x的754標准存儲格式為(C93B0000)(16)求其浮點數的十進制數值
1 轉化為2進制
12.5(10)= 1100.1(2) = 1.1001x 2^3 (2)
2 計算階碼,單精度附點
E = 127 + 3= 130 = 10000010 (2)
3 整理尾數,23位,去掉整數部分的1
10010000000000000000000
4 加上符號位,得到32位浮點數
0 10000010 10010000000000000000000
5 寫成16進制
12.5 = 0x41480000(f)
-12.5符號位為1
-12.5= 0xC1480000(f)