1前言當(dāng)我們學(xué)習(xí)C語(yǔ)言時(shí),我們通常認(rèn)為浮點(diǎn)數(shù)和小數(shù)是等效的,沒(méi)有嚴(yán)格的區(qū)分它們的概念。
這不會(huì)影響我們的學(xué)習(xí),因?yàn)楦↑c(diǎn)數(shù)和小數(shù)是綁定在一起的。
,只有小數(shù)點(diǎn)以浮點(diǎn)格式存儲(chǔ)。
實(shí)際上,整數(shù)和十進(jìn)制都可以以定點(diǎn)格式存儲(chǔ),或者都可以以浮點(diǎn)格式存儲(chǔ),但實(shí)際情況是C語(yǔ)言使用定點(diǎn)格式存儲(chǔ)整數(shù),而浮點(diǎn)格式存儲(chǔ)小數(shù)位,在“數(shù)字范圍”內(nèi)尋求兩個(gè)重要指標(biāo)“”之間平衡的結(jié)果。
和“數(shù)值精度”。
2什么是浮點(diǎn)數(shù)?浮點(diǎn)數(shù)僅表示實(shí)數(shù)。
浮點(diǎn)數(shù)在計(jì)算機(jī)中用于近似任何實(shí)數(shù)。
具體來(lái)說(shuō),通過(guò)將整數(shù)或定點(diǎn)數(shù)(即尾數(shù))乘以某個(gè)基數(shù)(在計(jì)算機(jī)中通常為2)的整數(shù)次冪來(lái)獲得此實(shí)數(shù)。
這種表示方法類似于以10為基礎(chǔ)的科學(xué)表示法。
3將浮點(diǎn)數(shù)存儲(chǔ)在內(nèi)存中首先,很明顯,整數(shù),浮點(diǎn)或字符等數(shù)據(jù)類型以二進(jìn)制模式存儲(chǔ)在計(jì)算機(jī)的底部。
浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式不同于整數(shù),因?yàn)檎麛?shù)可以一一對(duì)應(yīng)地轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。
浮點(diǎn)數(shù)的存儲(chǔ)由符號(hào)+指數(shù)+分?jǐn)?shù)組成。
類型符號(hào)位指數(shù)尾數(shù)浮點(diǎn)數(shù)1位(No.31)8位(No.23至30)23位(No.0至22)雙精度1位(No.63)11位(No.52至62)52位(第0?51位)Int和float也占用了四個(gè)字節(jié)的內(nèi)存,但是float可以表示的最大值比int大得多。
根本原因是浮點(diǎn)數(shù)以指數(shù)形式存儲(chǔ)在內(nèi)存中。
將浮點(diǎn)數(shù)轉(zhuǎn)換為內(nèi)存的步驟分為以下三個(gè)步驟:將浮點(diǎn)數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),以科學(xué)計(jì)數(shù)法表示二進(jìn)制浮點(diǎn)數(shù),并計(jì)算指數(shù)偏移后的值。
對(duì)于第三點(diǎn):在計(jì)算指數(shù)時(shí)需要添加偏移量。
(我將在后面介紹為什么使用偏移量),并且偏移量的值與浮點(diǎn)數(shù)的類型有關(guān)(浮點(diǎn)偏移量值為127,雙偏移量值為1023)。
例如,對(duì)于指數(shù)6,float和double類型的偏移量值為:float:127 + 6 = 133 double:1023 + 6 = 1029 4浮點(diǎn)數(shù)19.625如何與float一起存儲(chǔ)的示例:將浮點(diǎn)數(shù)轉(zhuǎn)換為二進(jìn)制:10011.101(將19.625的整數(shù)部分除以2得到余數(shù),將小數(shù)部分除以2進(jìn)行舍入);使用科學(xué)計(jì)數(shù)法表示二進(jìn)制浮點(diǎn)數(shù):1.0011101 * 2 ^ 4;計(jì)算指數(shù)偏移的值:127 + 4 = 131(10000011);馬賽克總結(jié)起來(lái),內(nèi)存中的float類型19.625的值為:0-10000011-001 1101 0000 0000 00000000。
5 float和double的范圍和精度f(wàn)loat和double的范圍由指數(shù)中的位數(shù)確定。
(因?yàn)楸硎拘问綖?.x * 2 ^ Y,所以忽略了1.x的影響,并且指數(shù)直接用于表示浮點(diǎn)數(shù)的范圍)float:1位(符號(hào)位)8位(指數(shù)位)23bits(尾數(shù)位)double:1bit(符號(hào)位)11bits(指數(shù)位)52bits(尾數(shù)位)因此float的指數(shù)范圍是-127?+ 128,double的指數(shù)范圍是-1023 ?+ 1024,并且指數(shù)位以代碼形式補(bǔ)充。
負(fù)指數(shù)確定浮點(diǎn)數(shù)可以表示的具有最小絕對(duì)值的非零數(shù)。
正指數(shù)決定了浮點(diǎn)數(shù)可以表示的絕對(duì)值最大的數(shù),也決定了浮點(diǎn)數(shù)的取值范圍。
浮動(dòng)范圍是-2 ^ 128?+ 2 ^ 128,即-3.40E + 38?+ 3.40E + 38; double的范圍是-2 ^ 1024?+ 2 ^ 1024,即-1.79E + 308?+ 1.79E + 308。
精度浮點(diǎn)數(shù)和雙精度數(shù)的精度取決于尾數(shù)的位數(shù)。
尾數(shù)表示小數(shù)點(diǎn)后的有效位數(shù)越多,精度越高。
根據(jù)科學(xué)記數(shù)法將浮點(diǎn)數(shù)存儲(chǔ)在存儲(chǔ)器中,并且整數(shù)部分始終是隱式的“ 1”。
由于它是常數(shù),因此不會(huì)影響精度。
float:2 ^ 23 = 8388608,共7位數(shù)字,表示最多可以有7位有效數(shù)字,但絕對(duì)可以保證6位數(shù)字,即float的精度為6?7位有效數(shù)字; double:2 ^ 52 = 4503599627370496,總共16位數(shù)字。
同樣,double的精度為15-16位。
6解剖:為什么要使用偏移量方法來(lái)計(jì)算索引?如果