999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C++中的浮點數在機器中的存儲精度問題

2020-11-20 02:12:29智愛娟劉雅琴侯鳳云
寫真地理 2020年37期
關鍵詞:存儲

智愛娟 劉雅琴 侯鳳云

摘 要: 浮點數是C++中最基本的數據類型,本文討論了浮點數在機器內存中的存儲情況、浮點數的顯示以及C++語言編程中使用浮點數需要注意的幾個問題。

關鍵詞: C++;浮點數;存儲;顯示;精度

【中圖分類號】TP31 ? ? 【文獻標識碼】A ? ? 【DOI】10.12215/j.issn.1674-3733.2020.37.135

1 引言

C++語言中的浮點數有float、double和long double三種類型,在使用C++語言編寫程序的過程中,使用最多的是float和double類型的浮點數。本文以float和double類型的浮點數為例,說明浮點數在機器內存中的存儲精度以及在C++語言編程中使用浮點數時需要注意的幾個問題。

2 浮點數在機器內存中的存儲

C++語言中的float和double類型的浮點數在機器內存中存儲時分別按照IEEE754標準中的單精度浮點格式和雙精度浮點格式進行的,而long double類型的浮點數在機器中存儲時的格式和長度則與機器所采用的微處理器類型有關。比如,在IA-32和X86-64系統中long double是按照IEEE754標準中的80位擴展雙精度格式進行存儲的。

IEEE754標準規定,單精度浮點數在機器中采用32位二進制表示,其中1位符號位,8位階碼,23位尾數,階碼采用移碼表示(偏置常數位127),尾數采用原碼表示(規格化形式,數值最高位的“1”隱含,不表示);雙精度浮點數在機器中采用64位表示,其中1位符號位,11位階碼,52位尾數,階碼采用移碼表示(偏置常數位1023),尾數采用原碼表示(規格化形式,數值最高位的“1”隱含,不表示)。

任意浮點數N均可表示成規格化形式為:±1.M×2e,對應IEEE754格式如下(小數點前總是“1”,故可隱含表示):

如果浮點數N為正數,則符號位S為0;N為負數,則符號位S=1。單精度浮點格式中,階碼E=e+127;雙精度浮點格式中,階碼E=e+1023。

例如,將十進制數1234567890分別賦值給float型變量a和double型變量b,變量a和b的機器數分別是多少呢?

十進制數1234567890轉換為二進制為:10010011001

01100000001011010010B=1.0010011001011000000010110

10010*230

因為是正數,S=0;指數e=30。

對于變量a,階碼E=e+127=30+127=157=10011101B;M取小數點后23位,第24位采用“0舍1入”進行舍入處理,M=001 0011 0010 1100 0000 0110。變量a的機器數是:0100 1110 1001 0011 0010 1100 0000 0110,用十六進制表示為:4E932C06。

對于變量b,階碼E=e+1023=30+1023=1053=10000011101B;M取52位,M=0010 0110 0101 1000 0000 1010 0000 0000 0000 0000 0000 0000 0000。變量b的機器數是:0100 0001 1101 0010 0110 0101 1000 0000 1010 0000 0000 0000 0000 0000 0000 0000,用十六進制表示為:41D26580A0000000。

3 浮點數的顯示

由于IEEE754單精度浮點數的尾數M為23位二進制表示,雙精度浮點數的尾數為52位二進制表示,再加上1位隱含位“1”,因此單精度浮點數的都有效二進制位為24位,雙精度為53位。而107<224<108,1017<253<1018,故float型浮點數在機器上顯示時最多可顯示8位有效數字,其中7位為精確值,double型浮點數則能顯示18位有效數字,其中17位為精確值。IEEE754浮點數可以用下式轉換為二進制數:(-1)S*1.M*2e。

例如,將變量a的機器數4E932C06H轉換為二進制為:(-1)0*1.001 0011 0010 1100 0000 0110*230=1001001100

101100000001100000000,即十進制的1234567936,這個值比實際值大46。但是,采用同樣的方法將變量b的機器數41D26580A0000000H轉換為十進制為1234567890,結果和實際值相同。由此可見,double型浮點數的精度比float型浮點數的精度高。

4 在C++語言中使用浮點數應該注意的幾個問題

(1)設計浮點數類型的目的是為了實現工程計算和科學計算,在工程計算和科學計算中往往沒有完全精確的計算結果,需要的是近似值。因此,在要求精確計算結果的場合(尤其是應用程序中),比如,對貨幣計算時一般不要使用浮點型數據,否則,將會得到錯誤的結果。

例如:假設想用十元錢去買價格不等的游戲幣,游戲幣的標價分別是1元、2元、3元,一直到10元不等。購買時,打算從標價為1元游戲幣開始按照價格從低到高的順序依次購買,每種購買一個,直到所剩的錢不夠支付任何一種游戲幣為止,最后,共可以購買多少個游戲幣呢?還會剩余多少零錢呢?

采用浮點數表示錢數和游戲幣的價格,用C++語言編寫程序如下:

#include

#include

using namespace std;

int main( )

{

int itemsBought = 0;//購買游戲幣個數

double Price;//游戲幣價格

double Funds = 10.00;//總錢數

for (Price =1.00; Funds >= Price; Price +=10.00)

{

Funds -= Price;

itemsBought++;

}

cout< ? ? cout<<"剩余錢數: "< ? ? }

編譯運行程序,得到結果為:“3個游戲幣”,“剩余錢數:4.00元”。很明顯,程序運行得到的結果是錯誤的。

解決這個問題的正確辦法是:在編寫C++程序時,浮點數表示錢數和游戲幣的價格。

使用int類型代替double類型修改上面的程序如下:

#include

using namespace std;

int main( )

{

int itemsBought = 0;//購買游戲幣個數

int Price;//游戲幣價格

int Funds = 100;//總錢數

for (Price = 10; Funds >= Price; Price += 10)

{

Funds -= Price;

itemsBought++;

}

cout< ? ? cout<<"剩余錢數:"< ? ? }

重新編譯運行程序,輸出結果:“4個游戲幣”和“剩余錢數:0元”。顯然,程序執行結果正確。

(2)在程序中不要用浮點型數據作為循環變量

例如,編寫程序:從0開始按照逐次遞增0.2輸出一直到10。在程序中用float型作為循環變量,用C++編程如下:

#include

using namespace std;

main(int argc,char *argv)

{

float i;

for(i=0;i<10;i+=.2)

printf("%10f",i);

return 0;

}

編譯運行程序,得到的輸出結果如下:

顯然,程序輸出結果是錯誤的。

解決問題的方法是:先將數據起始值、終止值和遞增量都擴大10倍變成整數,輸出前將結果再縮小10倍。重新編寫程序如下:

#include

using namespace std;

main(int argc,char *argv)

{

int i,a,b;

for(i=0;i<=50;i=i+2)

{

a=i/10;

b=i%10;

cout< ? ? }

return 0;

}

重新編譯運行程序,結果如下:

顯然,程序輸出是正確的。

(3)不要在程序中判斷浮點數是否相等

例如,判斷數據99.6345489和99.6345481的大小,編程如下:

#include

using namespace std;

int main(void)

{

float m = 99.6345489;

float n = 99.6345481;

if(m ? ? cout<<"m ? ? else if(m==n)

cout<<"m==n"< ? ? else

cout<<"m>n"< ? ? return 0;

}

閱讀分析上述程序,程序結果應該“m>n”,但是程序執行結果卻是“m ==n”。結果出錯的原因就是浮點數無法表示非常精確的結果。如程序中的float型變量m和n只能有8位有效數字,是無法區分出末位的9和1。在內存中,m和n的二進制數都是0x419F0329。

5 結束語

本文對C++程序中浮點數的使用作了簡單探討,為了編寫出安全、有效的代碼,建議在用高級語言編寫實際應用項目程序時盡量避免使用浮點型數據。

參考文獻

[1] 丁展.C/C++程序設計[M].北京:電子工業出版社,2018.

[2] 比雅尼.C++程序設計語言[M].北京:機械工業出版社,2002.

[3] 袁春風.計算機系統基礎[M].北京:機械工業出版社,2014.

[4] 唐朔飛.計算機組成原理[M].北京:高等教育出版社,2008.

[5] 李繼燦.新編16/32位微型計算機原理及應用.北京:清華大學出版社,2018.

猜你喜歡
存儲
檔案管理中電子文件的存儲探究
條形碼技術在涂裝生產中的應用
云計算與虛擬化
結構化電子病歷的設計及應用
淺敘國產存儲技術之發展
某醫院數據中心虛擬化的設計與實現
煙臺新型自動氣象站數據本地存儲的設計及實現
關于SQL語言及存儲過程
大型機電設備出口包裝防護
基于Hadoop的業務過程模型管理方法研究
主站蜘蛛池模板: 久操中文在线| 国产精品人莉莉成在线播放| 日韩av电影一区二区三区四区| 欧美在线导航| 播五月综合| 欧美性精品| 国产丝袜第一页| 久热精品免费| 亚洲色中色| 不卡的在线视频免费观看| 亚洲欧洲自拍拍偷午夜色| 香蕉在线视频网站| 精品国产自在现线看久久| 操美女免费网站| 中国一级毛片免费观看| 国产91视频免费| 国产性生大片免费观看性欧美| 亚瑟天堂久久一区二区影院| 无码aaa视频| 伊人欧美在线| 亚洲人妖在线| 欧美精品成人一区二区视频一| 国产原创演绎剧情有字幕的| 91在线无码精品秘九色APP| 国产精品亚洲一区二区在线观看| 亚洲综合九九| av一区二区无码在线| 精品国产女同疯狂摩擦2| 亚洲最大看欧美片网站地址| 国产精品林美惠子在线播放| 国产精品久久久免费视频| 黄色三级毛片网站| 久久男人视频| 精品少妇三级亚洲| 亚洲天堂日韩av电影| 国产精品亚欧美一区二区| 99在线小视频| 不卡的在线视频免费观看| 免费高清a毛片| 亚洲香蕉久久| 国产色图在线观看| 欧美国产日产一区二区| 日本人妻一区二区三区不卡影院| 国产在线98福利播放视频免费| 国产精品浪潮Av| 茄子视频毛片免费观看| 日本一本正道综合久久dvd| 理论片一区| 鲁鲁鲁爽爽爽在线视频观看| 欧美a级完整在线观看| 色一情一乱一伦一区二区三区小说| 亚洲一区二区三区中文字幕5566| 国产91小视频| 久久精品无码国产一区二区三区| 在线视频一区二区三区不卡| 日韩精品成人网页视频在线| 老色鬼久久亚洲AV综合| 免费一看一级毛片| 97视频免费在线观看| 成人蜜桃网| 青青青亚洲精品国产| 99热这里只有精品2| 亚洲国产中文精品va在线播放 | 热久久综合这里只有精品电影| 日韩在线永久免费播放| 国产区免费精品视频| 首页亚洲国产丝袜长腿综合| 国产一区二区在线视频观看| 又爽又大又黄a级毛片在线视频 | 日韩精品无码免费一区二区三区| 国产激情国语对白普通话| 国产麻豆精品久久一二三| 一级黄色网站在线免费看 | 毛片视频网址| 亚洲人妖在线| 伊伊人成亚洲综合人网7777| 天天综合网色| 狠狠色狠狠色综合久久第一次| 亚洲最大在线观看| 九色91在线视频| www.99在线观看| 91亚洲影院|