欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

關(guān)于C語言的浮點數(shù)溢出應(yīng)該怎么從二進制代碼上理解

劉柏宏2年前11瀏覽0評論

關(guān)于C語言的浮點數(shù)溢出應(yīng)該怎么從二進制代碼上理解?

關(guān)于C語言的浮點數(shù)溢出應(yīng)該怎么從二進制代碼上理解?我就來回答一下

電子計算機只能存儲0和1,人類世界所能認識的任何數(shù)據(jù)都需要通過轉(zhuǎn)換為二進制再進行存儲。整數(shù)(int)型轉(zhuǎn)換為二進制存儲很好理解,那么float型數(shù)據(jù)計算機又是怎么存儲的呢?常說的浮點型數(shù)據(jù)精度丟失和數(shù)據(jù)溢出又是怎么回事呢?

位和字節(jié)

位:來自英文bit,音譯為“比特”,表示二進制位。位是計算機內(nèi)部數(shù)據(jù)儲存的最小單位,11010100是一個8位二進制數(shù)。

字節(jié):來自英文Byte,音譯為“拜特”,習(xí)慣上用大寫的“B”表示。字節(jié)是計算機中數(shù)據(jù)處理的基本單位。計算機中以字節(jié)為單位存儲和解釋信息,規(guī)定一個字節(jié)由八個二進制位構(gòu)成,即1個字節(jié)等于8個比特(1Byte=8bit)。八位二進制數(shù)最小為00000000,最大為11111111;通常1個字節(jié)可以存入一個ASCII碼,2個字節(jié)可以存放一個漢字國標(biāo)碼。

int型數(shù)據(jù)存儲

int型數(shù)據(jù)根據(jù)平臺類型不同,所占用字節(jié)大小也不同,這里就按正常的4個字節(jié)來講。整型分有符號和無符號,有符號左邊最高位為符號位。

unsigned int和signed in按四個字節(jié)計算,也就是4*8=32位。int默認是signed有符號位的。所以,unsigned int表示的范圍是:0~2的32次方-1。signed int表示的范圍是:-2的31次方~2的31次方-1。

例如+3,轉(zhuǎn)為二進制是0000 0011,但是計算機是按補碼存儲整型數(shù)據(jù)的,正數(shù)的補碼就是其本身,但是負數(shù)的補碼就不是了。這里不作細講,有興趣的朋友可以翻看我前面的文章,里面有詳細介紹。

float型數(shù)據(jù)存儲

浮點數(shù)轉(zhuǎn)二進制方法

十進制小數(shù)轉(zhuǎn)換成二進制小數(shù)采用"乘2取整,按序取出"法。

整數(shù)部分按整數(shù)方式轉(zhuǎn),用短除法,小數(shù)部分按如下方式,最后再用小數(shù)點合起來;

具體做法是:用2乘十進制小數(shù),可以得到積,將積的整數(shù)部分取出,再用2乘余下的小數(shù)部分,又得到一個積,再將積的整數(shù)部分取出,如此進行,直到積中的小數(shù)部分為零,或者達到所要求的精度為止。然后把取出的整數(shù)部分按順序排列起來,先取的整數(shù)作為二進制小數(shù)的高位有效位,后取的整數(shù)作為低位有效位。

例:0.734375轉(zhuǎn)二進制,結(jié)果是0.101111。

0.734375 x 2 = 1.46875

0.46875 x 2 = 0.9375

0.9375 x 2 = 1.875

0.875 x 2 = 1.75

0.75 x 2 = 1.5

0.5 x 2 = 1.0

IEEE二進制浮點數(shù)算術(shù)標(biāo)準(zhǔn)

浮點數(shù)的存儲方式與整型數(shù)據(jù)不同。浮點數(shù)運算有自己的標(biāo)準(zhǔn)標(biāo)準(zhǔn),也稱IEEE二進制浮點數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE 754),是20世紀(jì)80年代以來最廣泛使用的浮點數(shù)運算標(biāo)準(zhǔn),為許多CPU與浮點運算器所采用。

根據(jù)國際標(biāo)準(zhǔn)IEEE(電氣和電子工程協(xié)會)規(guī)定,任何一個浮點數(shù)NUM的二進制數(shù)可以寫為:NUM = (-1) ^ S * M * 2 ^ E;//(S表示符號,E表示階乘,M表示有效數(shù)字)

這個標(biāo)準(zhǔn)是什么意思呢?其實說白了就是二進制的科學(xué)計數(shù)法:

十進制:12345678 = 1.2345678*10^7 ;

二進制:例如十進制11.0,寫成二進制就是1011.0,用IEEE標(biāo)準(zhǔn)表示就是(-1)^0 × 1.011 × 2^3 ,s=0,M=1.011,E=3;

浮點數(shù)存儲

浮點數(shù)在內(nèi)存中的存儲按下圖所示方式存儲:

1、對于S,用來表示符號,0為正,1為負

2、對于M:規(guī)定M在存儲時舍去第一個1,只存儲小數(shù)點之后的數(shù)字。這樣做節(jié)省了空間,以float類型為例,就可以保存23位小數(shù)信息,加上舍去的1就可以用23位來表示24個有效的信息。

3、對于E(指數(shù))E是一個字節(jié)(8位)整數(shù)所以E的取值范圍為(0~ 255),但是在計數(shù)中指數(shù)是可以為負的,所以規(guī)定在存入E時,在它原本的值上加上中間數(shù)(127),在使用時減去中間數(shù)(127),這樣E的真正取值范圍就成了(-127~128)。

因此對于32為單精度浮點數(shù):在IEEE-754標(biāo)準(zhǔn)中,32位浮點數(shù)X的真值可表示為:

X = (-1)^S×(1.M)×2 ^(E-127);

精度丟失

了解了float型數(shù)據(jù)的存儲原理,接下來了解一下float精度丟失的原因,以浮點數(shù)2.7為例:

首先,十進制轉(zhuǎn)換成二進制。由于2.7無法用二進制精確表示,因此此處出現(xiàn)一次精度丟失。

2.7 => 10.10110011001…

然后,用IEEE標(biāo)準(zhǔn)表示二進制浮點數(shù),得到s=0,M=1.010110011001…,E=1。

10.1011001… => (-1)^0 × 1.01011001… × 2^1

最后,按照IEEE標(biāo)準(zhǔn)保存數(shù)據(jù)。此時是單精度浮點數(shù),M只能保存小數(shù)點后23位,多余的部分被丟棄了,因此此處又一次精度丟失。

溢出

既然存儲有位數(shù)限制,那么溢出就很好理解了。超過最大能表示的數(shù)就是上溢,超過最小能表示的數(shù)就是下溢,只要計算出最大和最小能表示的數(shù)十多大就可以得出上下溢出的極限:

上溢極限:

下溢極限:

java階乘溢出,關(guān)于C語言的浮點數(shù)溢出應(yīng)該怎么從二進制代碼上理解