亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        C++中的浮點數(shù)在機(jī)器中的存儲精度問題

        2020-11-20 02:12:29智愛娟劉雅琴侯鳳云
        寫真地理 2020年37期
        關(guān)鍵詞:顯示浮點數(shù)存儲

        智愛娟 劉雅琴 侯鳳云

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

        關(guān)鍵詞: C++;浮點數(shù);存儲;顯示;精度

        【中圖分類號】TP31 ? ? 【文獻(xiàn)標(biāo)識碼】A ? ? 【DOI】10.12215/j.issn.1674-3733.2020.37.135

        1 引言

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

        2 浮點數(shù)在機(jī)器內(nèi)存中的存儲

        C++語言中的float和double類型的浮點數(shù)在機(jī)器內(nèi)存中存儲時分別按照IEEE754標(biāo)準(zhǔn)中的單精度浮點格式和雙精度浮點格式進(jìn)行的,而long double類型的浮點數(shù)在機(jī)器中存儲時的格式和長度則與機(jī)器所采用的微處理器類型有關(guān)。比如,在IA-32和X86-64系統(tǒng)中l(wèi)ong double是按照IEEE754標(biāo)準(zhǔn)中的80位擴(kuò)展雙精度格式進(jìn)行存儲的。

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

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

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

        例如,將十進(jìn)制數(shù)1234567890分別賦值給float型變量a和double型變量b,變量a和b的機(jī)器數(shù)分別是多少呢?

        十進(jìn)制數(shù)1234567890轉(zhuǎn)換為二進(jìn)制為:10010011001

        01100000001011010010B=1.0010011001011000000010110

        10010*230

        因為是正數(shù),S=0;指數(shù)e=30。

        對于變量a,階碼E=e+127=30+127=157=10011101B;M取小數(shù)點后23位,第24位采用“0舍1入”進(jìn)行舍入處理,M=001 0011 0010 1100 0000 0110。變量a的機(jī)器數(shù)是:0100 1110 1001 0011 0010 1100 0000 0110,用十六進(jìn)制表示為: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的機(jī)器數(shù)是:0100 0001 1101 0010 0110 0101 1000 0000 1010 0000 0000 0000 0000 0000 0000 0000,用十六進(jìn)制表示為:41D26580A0000000。

        3 浮點數(shù)的顯示

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

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

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

        4 在C++語言中使用浮點數(shù)應(yīng)該注意的幾個問題

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

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

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

        #include

        #include

        using namespace std;

        int main( )

        {

        int itemsBought = 0;//購買游戲幣個數(shù)

        double Price;//游戲幣價格

        double Funds = 10.00;//總錢數(shù)

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

        {

        Funds -= Price;

        itemsBought++;

        }

        cout< ? ? cout<<"剩余錢數(shù): "< ? ? }

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

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

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

        #include

        using namespace std;

        int main( )

        {

        int itemsBought = 0;//購買游戲幣個數(shù)

        int Price;//游戲幣價格

        int Funds = 100;//總錢數(shù)

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

        {

        Funds -= Price;

        itemsBought++;

        }

        cout< ? ? cout<<"剩余錢數(shù):"< ? ? }

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

        (2)在程序中不要用浮點型數(shù)據(jù)作為循環(huán)變量

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

        #include

        using namespace std;

        main(int argc,char *argv)

        {

        float i;

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

        printf("%10f",i);

        return 0;

        }

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

        顯然,程序輸出結(jié)果是錯誤的。

        解決問題的方法是:先將數(shù)據(jù)起始值、終止值和遞增量都擴(kuò)大10倍變成整數(shù),輸出前將結(jié)果再縮小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;

        }

        重新編譯運行程序,結(jié)果如下:

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

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

        例如,判斷數(shù)據(jù)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;

        }

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

        5 結(jié)束語

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

        參考文獻(xiàn)

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

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

        [3] 袁春風(fēng).計算機(jī)系統(tǒng)基礎(chǔ)[M].北京:機(jī)械工業(yè)出版社,2014.

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

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

        猜你喜歡
        顯示浮點數(shù)存儲
        四種Python均勻浮點數(shù)生成方法
        電腦報(2021年11期)2021-07-01 08:26:31
        在C語言中雙精度浮點數(shù)線性化相等比較的研究
        非精確浮點數(shù)乘法器設(shè)計
        檔案管理中電子文件的存儲探究
        條形碼技術(shù)在涂裝生產(chǎn)中的應(yīng)用
        云計算與虛擬化
        硬幣自動分揀計數(shù)顯示裝置
        壓力計測量數(shù)據(jù)顯示系統(tǒng)的設(shè)計與實現(xiàn)
        大型機(jī)電設(shè)備出口包裝防護(hù)
        飛機(jī)座艙顯示/控制系統(tǒng)設(shè)計淺析
        免费国产一区二区视频| 极品 在线 视频 大陆 国产| 亚洲性色ai无码| 日本加勒比精品一区二区视频| 色综合久久中文娱乐网| 亚洲精品成人网站在线观看| 久久天天躁狠狠躁夜夜中文字幕| 亚洲国产精品嫩草影院久久av| 亚洲精品无码不卡| 99精品国产99久久久久久97| 97精品国产91久久久久久久| 国产一区二区三区再现| 亚洲中文字幕日产无码| 丰满少妇大力进入av亚洲| 二区久久国产乱子伦免费精品 | 少妇被粗大的猛进出69影院| 亚洲欧美日韩综合久久久| 国产传媒在线视频| 日本不卡一区二区三区久久精品| 国产又爽又大又黄a片| 五十路熟妇亲子交尾| 亚洲一级av大片在线观看| 国产在线一区二区三精品乱码| 国产精品无码午夜福利| 国产精品久久久久…| 在线小黄片视频免费播放| 免费av一区二区三区无码| 无码人妻精品一区二区三区66| 国产亚洲一区二区三区夜夜骚| 蜜臀av毛片一区二区三区 | 成全视频高清免费| 国产亚洲一区二区三区成人| 日韩精品第一区二区三区| 女人扒开屁股爽桶30分钟| 无码一区二区三区不卡AV| av高潮一区二区三区| 亚洲欧美乱日韩乱国产| 91福利视频免费| 人妻露脸国语对白字幕| 亚洲av无码码潮喷在线观看| 国内少妇偷人精品视频免费|