建設(shè)銀行網(wǎng)站不能登錄密碼seo文章是什么
目錄
浮點(diǎn)數(shù)的編碼表示
浮點(diǎn)數(shù)類型
?編輯
浮點(diǎn)數(shù)的表示
(1)浮點(diǎn)數(shù)(Float Point)的表示范圍
(2)規(guī)格化數(shù)形式
(3)IEEE 754標(biāo)準(zhǔn)
其他形式的機(jī)器數(shù)表示
?個(gè)人總結(jié)
浮點(diǎn)數(shù)的編碼表示
浮點(diǎn)數(shù)類型
C語言聲明 | 操作數(shù)類型 | 存儲(chǔ)長度(位) |
---|---|---|
float | 單精度浮點(diǎn)數(shù) | 32 |
double | 雙精度浮點(diǎn)數(shù) | 64 |
long double | 擴(kuò)展精度浮點(diǎn)數(shù) | 80 / 96 |
實(shí)數(shù)類型分為:單精度浮點(diǎn),浮點(diǎn)雙精度和擴(kuò)展精度浮點(diǎn)
科學(xué)計(jì)數(shù)法(Scientific Notation) 與浮點(diǎn)數(shù)
從上面可以看出,對于一個(gè)實(shí)數(shù)都可以用一個(gè)定點(diǎn)整數(shù)和定點(diǎn)小數(shù)來表示,其中規(guī)格化的形式,小數(shù)點(diǎn)前面只有一個(gè)非0的數(shù),對于二進(jìn)制表示時(shí),必定是1?
浮點(diǎn)數(shù)的表示
(1)浮點(diǎn)數(shù)(Float Point)的表示范圍
- 以下面的32位浮點(diǎn)數(shù)格式的規(guī)格化數(shù)為例,計(jì)算表示范圍
1、第0位數(shù)代表符號(hào)位
2、第1~8位為8位移碼表示階碼E(偏置常數(shù)為128)
3、第9~31位為24位二進(jìn)制原碼小數(shù)表示的尾數(shù)M(tips:注意這里定點(diǎn)小數(shù)表示尾數(shù)是采用的原碼表示)
規(guī)格化尾數(shù)的小數(shù)點(diǎn)后第一位總是1,故規(guī)定第一位默認(rèn)的1不明顯的表示出來,這樣可以用23位表示24位的尾數(shù)
?因?yàn)樵a對稱,故其表示范圍關(guān)于原點(diǎn)對稱。可表示范圍包括圖中的陰影部分和0
機(jī)器0:即尾數(shù)為0或落在下溢區(qū)中的數(shù)
浮點(diǎn)數(shù)范圍比定點(diǎn)數(shù)大,但數(shù)的個(gè)數(shù)沒變多,故數(shù)之間更稀疏,且不均勻
(2)規(guī)格化數(shù)形式
為了能表示更多有效數(shù)字,通常規(guī)定規(guī)格化數(shù)的小數(shù)點(diǎn)前為1
?
32bit規(guī)格化數(shù)
其中:
1)S是符號(hào)位(Sign)?
2) Exponent用移碼表示(移碼其實(shí)就是原碼加上一個(gè)偏置常數(shù))來表示
3)Significand表示xxxxxxxxxx(部分尾數(shù))基可以是2/4/8/16,約定信息,無需顯示表示
早期的計(jì)算機(jī)各自用自己的浮點(diǎn)數(shù),這樣會(huì)帶來的結(jié)果是在不同的計(jì)算機(jī)中采用不同的格式解析數(shù)據(jù),其實(shí)是不通用的,所以出現(xiàn)了IEEE754標(biāo)準(zhǔn)
(3)IEEE 754標(biāo)準(zhǔn)
?這里插入一個(gè)鏈接,講解IEEE 754非常詳細(xì)的一個(gè)博客
IEEE754標(biāo)準(zhǔn): 一 , 浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式 - 知乎 (zhihu.com)
?其中,需要注意的是上面的博客中沒有指出階碼全0和全1是用來表示特殊情況的。
Q:為什么移碼的偏置常數(shù)采用127而不是像之前的128
A:? ?IEEE 754標(biāo)準(zhǔn)中,單精度浮點(diǎn)數(shù)可表示的范圍是0000 0001(-126)~1111 1110(127);如果偏置常數(shù)采用的是128,則32位浮點(diǎn)數(shù)可表示的范圍是0000 0001(-127)~1111 1110(126),2^-126~2^127比2^-127~2^126可表示的范圍大
Q:已知float型變量x的機(jī)器數(shù)為BEE0 0000H,求x的值是多少?
A:轉(zhuǎn)換為2進(jìn)制,1? 0111 1101 110 0000 0000 0000 0000 0000
符號(hào)位:1(負(fù)數(shù))?
階碼(指數(shù)):為避免混淆,用階碼表示階的編碼,用階或者指數(shù)表示階碼的值
階碼:0111 1101B = 125
階碼的值:125-127 = -2(指數(shù)為-2)
尾數(shù)數(shù)值部分:?1 +1x2-1+ 1x2-2+ 0x2-3+ 0x2-4+ 0x2-5+… =1+2-1+2-2= 1+0.5 +0.25 = 1.75
所以真值是:-1.75x2^-2 = -0.4375
Q: 已知float型變量x的值為-12.75,求x的機(jī)器數(shù)是多少?
A: -12.75=-1100.11B =-1.10011B x 2^3符號(hào)S=1
階碼E=127+3=128+2=1000 0010
顯式表示的部分尾數(shù)Significant = 100 1100 0000 0000 0000 0000(第一個(gè)1可以不用顯示表示出來,因?yàn)橐?guī)格化規(guī)定小數(shù)點(diǎn)前面一個(gè)數(shù)是非0的而且只有一位,必定是一個(gè)1)所以: x 的機(jī)器數(shù)表示為: 1 ,1000 0010, 100 1100 0000 0000 0000 0000
轉(zhuǎn)換為十六進(jìn)制表示為:C14C0000H
其他形式的機(jī)器數(shù)表示
前面定義的是針對規(guī)格化形式(normalized form)的數(shù),那么,其他形式的機(jī)器數(shù)表示什么樣的信息呢?
(1)0的機(jī)器數(shù)表示
0其實(shí)就是尾數(shù)部分和階碼部分都是為0的,不同的符號(hào)位表示+0和-0,二者都是有效的
How to represent 0?
exponent: all zeros
significand: all zeros
What about sign?Both cases valid.
+0: 0 00000000 00000000000000000000000
-0: 1 00000000 00000000000000000000000
(2)+∞/-∞的機(jī)器數(shù)表示
無窮其實(shí)就是階碼全為1,其中尾數(shù)部分全為0,不同的符號(hào)位表示正無窮和負(fù)無窮
浮點(diǎn)數(shù)除0的結(jié)果是+/-∞, 而不是溢出異常.(整數(shù)除0為異常)
為什么要這樣處理? 可以利用+∞/-∞作比較。例如:X/0>Y可作為有效比較
How to represent +∞/-∞?
Exponent: all ones (11111111B = 255)
Significand: all zeros
+∞: 0 11111111 00000000000000000000000
-∞:? 1 11111111 00000000000000000000000
(3)“非數(shù)”的表示(NaN)
非數(shù),這個(gè)錯(cuò)誤其實(shí)在編寫程序的時(shí)候也是經(jīng)常遇到的一種情況,其中非數(shù)就是階碼全為1,尾數(shù)部分不為0的情況
例如“Sqrt (-4.0) ”,“0/0”等的結(jié)果稱為Not a Number (NaN) ,即“非數(shù)”
NaNs 可以幫助調(diào)試程序
How to represent NaN ?
Exponent: 255
Significand: nonzero
4. 非規(guī)格化數(shù)(Denorms)的表示
除了上面的三種情況,其實(shí)只剩下一種,就是階碼全為0,尾數(shù)部分不為0,這表示的就是非規(guī)格化數(shù)
How to represent Denorms?
Exponent: 0
Significand: nonzero
這張圖,其實(shí)包含了很多信息,其中用規(guī)格化數(shù)表示浮點(diǎn)數(shù)其實(shí)不能表示完全,比如最小的整數(shù)用規(guī)格化數(shù)表示其實(shí)就是上面圖中的1.0000....x2^-126,對于比如說2^-125~2^-124和2^-124~2^-123,其中后者長度是前者的兩倍,但是由于尾數(shù)部分的位數(shù)是固定的,其實(shí)二者之間可以表示的數(shù)據(jù)的個(gè)數(shù)是一樣的,都是2^23個(gè),所以對于浮點(diǎn)數(shù)來說,數(shù)據(jù)越大,可以表示的最近的兩個(gè)浮點(diǎn)數(shù)的距離是越來越大的,數(shù)據(jù)越小其實(shí)可以表示的數(shù)據(jù)精度越高,越有可能可以精確表示,但是數(shù)字越大,由于可以表示的數(shù)字間距越來越大,所以表示的就可能更不精確,這也是為什么我之前一直不知道為什么計(jì)算機(jī)不能表示任意的浮點(diǎn)數(shù),比如0.1+0.2不是0.3會(huì)有偏差的原因,就是不能表示0.3只能取離它最近的一個(gè)浮點(diǎn)數(shù)來表示。
?個(gè)人總結(jié)
1、任何一個(gè)實(shí)數(shù)都可以用一個(gè)定點(diǎn)整數(shù)和一個(gè)定點(diǎn)小數(shù)來表示,其中定點(diǎn)整數(shù)其實(shí)就是指的整數(shù)(來表示科學(xué)計(jì)數(shù)法中的指數(shù)部分),定點(diǎn)小數(shù)一般表示科學(xué)計(jì)數(shù)法中的小數(shù)部分(尾數(shù))。
2、浮點(diǎn)數(shù)是有精度的,之前是不知道為什么有的浮點(diǎn)數(shù)在計(jì)算機(jī)中是沒有辦法存儲(chǔ)和表示的,只能根據(jù)某個(gè)特定的規(guī)則進(jìn)行舍入和表示,而且浮點(diǎn)數(shù)數(shù)字越小越有可能精確表示,對于浮點(diǎn)數(shù)越大,精確表示的可能就越小,因?yàn)閿?shù)越大,可表示的兩個(gè)浮點(diǎn)數(shù)之間的距離越來越大。
3、浮點(diǎn)數(shù)采用科學(xué)計(jì)數(shù)法,只需要定點(diǎn)小數(shù)表示尾數(shù)(采用原碼)和定點(diǎn)整數(shù)表示指數(shù)部分就可以表示任意一個(gè)浮點(diǎn)數(shù)
4、IEEE 754標(biāo)準(zhǔn)的一個(gè)好的博客
IEEE754標(biāo)準(zhǔn): 一 , 浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式 - 知乎 (zhihu.com)