一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C語言浮點(diǎn)數(shù)運(yùn)算

 奔向工程小拿 2013-11-01

   C語言標(biāo)準(zhǔn)C89里規(guī)定了3種浮點(diǎn)數(shù),float型、double型和long double型,常見的浮點(diǎn)型長度為float型占4個(gè)字節(jié),double型占8個(gè)字節(jié),long double型長度要大于等于double型,下面將以float型為例進(jìn)行介紹,double型和long double型只是比float型位數(shù)長,原理是一樣的 。

  float型可以表示的十進(jìn)制范圍是-3.402823466e38~3.402823466e38,而作為同為4個(gè)字節(jié)的定點(diǎn)數(shù)卻只能表示-2147483648~2147483647的范圍,使用同樣的內(nèi)存空間,浮點(diǎn)數(shù)卻能比定點(diǎn)數(shù)表示大得多的范圍,這是不是太神奇了?既然浮點(diǎn)數(shù)能表示這么大的范圍,那么我們?yōu)楹尾皇褂酶↑c(diǎn)數(shù)來代替定點(diǎn)數(shù)呢?先不說浮點(diǎn)數(shù)實(shí)現(xiàn)起來比較復(fù)雜,有些處理器還專門配置了硬件浮點(diǎn)運(yùn)算單元用于浮點(diǎn)運(yùn)算,主要原因是浮點(diǎn)數(shù)根本就無法取代定點(diǎn)數(shù),因?yàn)榫葐栴}。魚和熊掌不可兼得,浮點(diǎn)數(shù)表示了非常大的范圍,但它失去了精度。


ANSI/IEEE Std 754-1985標(biāo)準(zhǔn)
  IEEE 754是最廣泛使用的二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn),被許多CPU與浮點(diǎn)運(yùn)算器所采用。IEEE 754規(guī)定了多種表示浮點(diǎn)數(shù)值的方式,下面介紹32位二進(jìn)制的float浮點(diǎn)類型。它被分為3個(gè)部分,分別是符號(hào)位S(sign bit)、指數(shù)偏差E(exponent bias)和小數(shù)部分F(fraction),這三部分都是對應(yīng)二進(jìn)制碼的。

 

  浮點(diǎn)表示的一般形式為(科學(xué)技術(shù)法規(guī)則):R=(S) * (1 + F) * 2e (R:實(shí)數(shù)       S:正負(fù)符號(hào)      F:小數(shù)部分     e:指數(shù),不同于指數(shù)偏差)。

  • 符號(hào)位S:占1位,0代表浮點(diǎn)數(shù)是正數(shù),1代表浮點(diǎn)數(shù)是負(fù)數(shù)。
  • 指數(shù)偏差E:占8位,范圍是0~255,e = E - 127,e為正值表明轉(zhuǎn)換成二進(jìn)制碼后,按科學(xué)計(jì)數(shù)法表達(dá)時(shí)向左移動(dòng)了e位, 負(fù)值表明向右移動(dòng)了e位。
  • 小數(shù)部分F:占23位,實(shí)際上是將浮點(diǎn)數(shù)轉(zhuǎn)換成二進(jìn)制碼,再按科學(xué)計(jì)數(shù)法表達(dá),將其小數(shù)部分存在F上,由于二進(jìn)制碼按科學(xué)計(jì)數(shù)法表達(dá)后,只要值不為0,整數(shù)部分就必然為1,所以可以省略整數(shù)部分。

  例如,3.75的二進(jìn)制碼為11.11,將該二進(jìn)制碼按科學(xué)計(jì)數(shù)法表達(dá)為1.111,則向左移動(dòng)了1位,即e=1,E=e+127=128,F(xiàn)記錄的便是小數(shù)部分,實(shí)際為111000...000。


  下面介紹一下小數(shù)部分轉(zhuǎn)換為二進(jìn)制碼的方式。類似于整數(shù)的形式(如7 = 22 + 21 + 20),小數(shù)部分的轉(zhuǎn)換形式為2-1、2-2、2-3、2-4......,例如0.5 = 2-1,即二進(jìn)制碼為0.1,0.05 = 2-5 + 2-6 + 2-9 + 2-10 + 2-13 + 2-14 +...... (可無限循環(huán)),即二進(jìn)制碼為0.00001100110011......。如果都以16位計(jì),那么7的二進(jìn)制碼為0000000000000111,0.5的二進(jìn)制碼為0.1000000000000000,0.05的二進(jìn)制碼為0.0000110011001100。這是如何換算出來的呢?且看下面的算法便知:

  換算0.5,乘法結(jié)果初始為0.5,所有乘數(shù)為2,每次用乘法結(jié)果 * 乘數(shù),得到新的乘法結(jié)果,結(jié)果中的整數(shù)部分被提取出來,剩余的小數(shù)部分繼續(xù)參加下一次乘法運(yùn)算,直到剩余小數(shù)部分為0,或者無終點(diǎn)(無限循環(huán))。根據(jù)表格中的整數(shù)部分可知,二進(jìn)制為0.1。

整數(shù)部分 乘數(shù) 乘法結(jié)果 剩余小數(shù)部分
0. 2 0.5  0.5
1   1 0
     結(jié)束  

  換算0.05,乘法結(jié)果初始為0.05,所有乘數(shù)為2,每次用乘法結(jié)果 * 乘數(shù),得到新的乘法結(jié)果,結(jié)果中的整數(shù)部分被提取出來,剩余的小數(shù)部分繼續(xù)參加下一次乘法運(yùn)算,直到剩余小數(shù)部分為0,或者無終點(diǎn)(無限循環(huán))。根據(jù)表格中的整數(shù)部分可知,二進(jìn)制為0.00001100110011......。

整數(shù)部分 乘數(shù) 乘法結(jié)果 剩余小數(shù)部分
0. 2 0.05  0.05
0 2 0.1 0.1
0 2 0.2 0.2 
0 2 0.4 0.4
0 2 0.8  0.8
1 2 1.6 0.6
1 2 1.2 0.2
0 2 0.4 0.4
0 2 0.8 0.8
1  2 1.6 0.6
1   1.2 0.2
    無限循環(huán)  

例1:float型浮點(diǎn)數(shù)125.5轉(zhuǎn)化成32位二進(jìn)制浮點(diǎn)數(shù)。

  125.5的整數(shù)和小數(shù)部分的二進(jìn)制碼分別為1111101和0.1,于是125.5的二進(jìn)制碼為1111101.1,按科學(xué)技術(shù)法寫為1.1111011*26,即向左移6位,則e=6,E=e+127=133,133的二進(jìn)制碼為10000101。而1.1111011把整數(shù)部分的1去掉后,剩下小數(shù)部分為1111011,之后補(bǔ)0至23位,構(gòu)成F。所以125.5的32位二進(jìn)制浮點(diǎn)數(shù)為:
0  10000101  11110110000000000000000

例2:float型浮點(diǎn)數(shù)0.5轉(zhuǎn)化成32位二進(jìn)制浮點(diǎn)數(shù)。

  類似的,0.5的二進(jìn)制碼為0.1,按科學(xué)技術(shù)法寫為1.0*2-1,即向右移1位,則e=-1,則E=e+127=126,126的二進(jìn)制碼為01111110。而1.0把整數(shù)部分的1去掉后,剩下小數(shù)部分為0,之后補(bǔ)0至23位,構(gòu)成F。所以0.5的32位二進(jìn)制浮點(diǎn)數(shù)為:
0  01111110  00000000000000000000000


幾個(gè)特殊的情形

  • E=0,F(xiàn)=0時(shí),表示浮點(diǎn)數(shù)0,此時(shí)浮點(diǎn)數(shù)受S影響,表現(xiàn)出+0和-0兩種0,但數(shù)值是相等的。比如二進(jìn)制數(shù)0x00000000表示+0,二進(jìn)制數(shù)0x80000000表示-0。
  • E=0,F(xiàn)不等于0時(shí),浮點(diǎn)數(shù)為(S) * (F) * 2e,注意e為-126,而不是0-127=-127,而且F是0.xxx格式而不是1.xxx格式,比如0x00000001的浮點(diǎn)數(shù)為2-126*2-23=1.4012984643248170709237295832899e-45,而不是20-127*(1+2-23)。E從0變?yōu)?,不會(huì)產(chǎn)生增加2倍的關(guān)系,而是計(jì)算公式改變了(恢復(fù)正常公式)。
  • E=255,F(xiàn)不等于0時(shí),表示非數(shù)值,也就是說是非法數(shù),例如0x7F800001。
  • E=255,F(xiàn)=0時(shí),表示無窮大的數(shù),此時(shí)浮點(diǎn)數(shù)受S影響,例如0x7F800000表示正無窮大,0xFF800000表示負(fù)無窮大。做除法時(shí),如果除以0時(shí),結(jié)果將被記作0x7F800000。

浮點(diǎn)數(shù)的精度

  從前文中可以看到,1.xxx這類浮點(diǎn)數(shù)中,F(xiàn)部分最小的是2-23,對應(yīng)的十進(jìn)制數(shù)為1.00000011920928955078125,可以精確表示到小數(shù)點(diǎn)后23位,但是一些C語言書上卻說float型的有效位只有6~7位,這是為什么呢?原因在于二進(jìn)制小數(shù)與十進(jìn)制小數(shù)沒有完全一一對應(yīng)的關(guān)系,二進(jìn)制小數(shù)相比十進(jìn)制小數(shù)來說,是離散而不是連續(xù)的,我們來看看下面這些數(shù)字:

二進(jìn)制小數(shù)    十進(jìn)制小數(shù)
2-23       1.00000011920928955078125
2-22       1.0000002384185791015625
2-21       1.000000476837158203125
2-20       1.00000095367431640625
2-19       1.0000019073486328125
2-18       1.000003814697265625

  這里只需要關(guān)注F,上面列出了1.xxx這類浮點(diǎn)數(shù)中的6個(gè)最小的二進(jìn)制小數(shù),及其對應(yīng)的十進(jìn)制數(shù)??梢钥吹绞褂枚M(jìn)制所能表示的最小小數(shù)是1.00000011920928955078125,其次是1.0000002384185791015625,這兩個(gè)數(shù)之間是有間隔的,如果想用二進(jìn)制小數(shù)來表示8位有效數(shù)(只算小數(shù)部分,小數(shù)點(diǎn)前面的1是隱藏的默認(rèn)值)1.00000002、1.00000003、1.00000004......這些數(shù)是無法辦到的,而7位有效數(shù)1.0000001可以用2-23來表示,1.0000002可以用2-22來表示,1.0000003可以用2-23+2-22來表示。從這個(gè)角度來看,float型所能精確表示的位數(shù)只有7位,7位之后的數(shù)雖然也是精確表示的,但卻無法表示任意一個(gè)想表示的數(shù)值。

  但還是有一些例外的,比如說7位有效數(shù)1.0000006這個(gè)數(shù)就無法用F表示,這也表明二進(jìn)制小數(shù)對于十進(jìn)制小數(shù)來說相當(dāng)于是離散的,剛好湊不出1.0000006這個(gè)數(shù),從這點(diǎn)來看float型所能精確表示的位數(shù)只有6位。因此float型的有效位數(shù)是6~7位,但這個(gè)說法應(yīng)該不是非常準(zhǔn)確,準(zhǔn)確來說應(yīng)該是6位,C語言的頭文件中規(guī)定也是6位。對于一個(gè)很大的數(shù),例如1234567890,它是由于指數(shù)E系數(shù)而被放大了的,但它的有效位仍然是F所能表示的6~7位有效數(shù)字。1234567890用float表示后為1234567936,只有高7位是有效位,后3位是無效的。int型可以準(zhǔn)確的表示1234567890,而float浮點(diǎn)數(shù)則只能近似的表示1234567890,精度問題決定了float型無法取代int型。

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多

    成人精品视频一区二区在线观看| 国产精品偷拍视频一区| 国产综合一区二区三区av| 亚洲专区中文字幕视频| 日本午夜乱色视频在线观看| 婷婷激情四射在线观看视频| 欧美日韩精品久久第一页| 亚洲天堂久久精品成人| 亚洲国产一级片在线观看| 精品视频一区二区三区不卡| 综合久综合久综合久久| 国产欧洲亚洲日产一区二区| 中字幕一区二区三区久久蜜桃 | 国产又大又硬又粗又湿| 久久国产亚洲精品赲碰热| 欧美日韩国产精品第五页| 国产精品久久熟女吞精| 一区二区三区亚洲天堂| 精品国产亚洲av久一区二区三区| 正在播放国产又粗又长| 久久青青草原中文字幕| 午夜精品国产一区在线观看| 欧美成人一区二区三区在线| 四季精品人妻av一区二区三区 | 亚洲精品中文字幕熟女| 黄片在线观看一区二区三区| 国产精品白丝久久av| 免费精品国产日韩热久久| 国产欧美日韩综合精品二区| 中文字幕免费观看亚洲视频| 国产精品人妻熟女毛片av久久| 欧美日韩国产黑人一区| 国产精品蜜桃久久一区二区| 亚洲天堂有码中文字幕视频| 九九热在线视频观看最新| 欧美黑人黄色一区二区| 亚洲中文字幕在线乱码av| 少妇熟女精品一区二区三区| 91人妻久久精品一区二区三区| 日韩偷拍精品一区二区三区| 人妻少妇av中文字幕乱码高清|