国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

浮點(diǎn)類型有效位數(shù)計(jì)算與應(yīng)用分析

2019-06-09 10:36肖紅德
軟件導(dǎo)刊 2019年4期
關(guān)鍵詞:存儲(chǔ)單元

肖紅德

摘 要:為弄清浮點(diǎn)類型數(shù)據(jù)在應(yīng)用中存在“異?!爆F(xiàn)象的原因,研究了浮點(diǎn)類型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,得到與其在內(nèi)存中存儲(chǔ)規(guī)范一致的結(jié)果。分析浮點(diǎn)類型數(shù)據(jù)在內(nèi)存中存儲(chǔ)形式對(duì)應(yīng)的理論區(qū)間并進(jìn)行實(shí)驗(yàn)驗(yàn)證,得出浮點(diǎn)類型數(shù)據(jù)的精度(對(duì)于規(guī)范化浮點(diǎn)類型數(shù)據(jù),float類型有效位數(shù)為6~8位,double類型有效位數(shù)為15~17位),進(jìn)而對(duì)浮點(diǎn)類型數(shù)據(jù)在應(yīng)用中的一些異?,F(xiàn)象進(jìn)行合理解釋,比如“大數(shù)吃小數(shù)”、輸出格式控制以及輸出結(jié)果與預(yù)期不一致等。通過對(duì)浮點(diǎn)類型數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中表達(dá)形式的理論分析和實(shí)驗(yàn)驗(yàn)證,實(shí)現(xiàn)對(duì)實(shí)際數(shù)據(jù)進(jìn)行離散化處理,為計(jì)算機(jī)內(nèi)存中的表示和相關(guān)計(jì)算帶來幫助。

關(guān)鍵詞:浮點(diǎn)類型;有效位數(shù);存儲(chǔ)單元;數(shù)制轉(zhuǎn)換;不精確表示

DOI:10. 11907/rjdk. 182282

中圖分類號(hào):TP301文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1672-7800(2019)004-0050-07

0 引言

數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中是以二進(jìn)制存放的[1-3]?;菊蚷nt類型在存儲(chǔ)單元中的存儲(chǔ)方式用整數(shù)補(bǔ)碼存放[1]。Visual c++6.0為每一個(gè)int型數(shù)據(jù)分配4個(gè)字節(jié)(32位)。對(duì)于整數(shù)補(bǔ)碼的求法有以下規(guī)定:一個(gè)正數(shù)的補(bǔ)碼是其二進(jìn)制形式;一個(gè)負(fù)數(shù)的補(bǔ)碼,應(yīng)先獲得其絕對(duì)值的二進(jìn)制形式,然后對(duì)其后所有二進(jìn)位按位取反,再加1[2]。十進(jìn)制轉(zhuǎn)換R進(jìn)制按照整數(shù)部分除R取余和小數(shù)部分乘R取整的方法進(jìn)行[4,5]。在存放int類型數(shù)據(jù)的存儲(chǔ)單元中,最左面一位用來表示符號(hào),如果該位為0,則表示數(shù)值為正;如果該位為1,則表示數(shù)值為負(fù)。

浮點(diǎn)類型數(shù)據(jù)研究主要圍繞以下問題進(jìn)行:①浮點(diǎn)類型在內(nèi)存中的表示形式規(guī)定;②浮點(diǎn)類型數(shù)據(jù)表示范圍;③浮點(diǎn)類型數(shù)據(jù)精度;④驗(yàn)證浮點(diǎn)類型數(shù)據(jù)和具體計(jì)算結(jié)果是否一致。

對(duì)于問題①,浮點(diǎn)類型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式有相關(guān)規(guī)定[1,3,6-19],其存儲(chǔ)形式與整型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式不同。浮點(diǎn)類型分為單精度浮點(diǎn)類型(float類型)和雙精度浮點(diǎn)類型(double類型)兩種。Visual C++6.0編譯軟件為float類型數(shù)據(jù)分配4個(gè)字節(jié),為double類型數(shù)據(jù)分配8個(gè)字節(jié),數(shù)值以規(guī)范化二進(jìn)制指數(shù)形式存放在存儲(chǔ)單元中。在存儲(chǔ)時(shí),系統(tǒng)將浮點(diǎn)類型數(shù)據(jù)分成小數(shù)部分和指數(shù)部分,分別存放。不論是float類型數(shù)據(jù)還是double類型數(shù)據(jù),存儲(chǔ)方式上都遵從IEEE規(guī)范,float類型數(shù)據(jù)遵從IEEE R32.24,而double類型數(shù)據(jù)遵從IEEER64.53[8]。

對(duì)于問題②,文獻(xiàn)[10]進(jìn)行了較為詳細(xì)的研究和分析。

對(duì)于問題③,文獻(xiàn)[9,20]進(jìn)行了相關(guān)浮點(diǎn)類型數(shù)據(jù)位數(shù)的理論計(jì)算和分析。

對(duì)于問題④,文獻(xiàn)[3,6]通過實(shí)驗(yàn)驗(yàn)證了浮點(diǎn)類型數(shù)據(jù)存儲(chǔ)格式在計(jì)算機(jī)內(nèi)存中的表示形式。

在下文描述中,S表示符號(hào)位,E表示指數(shù)位,e表示指數(shù)部分的位數(shù),M表示尾數(shù)部分,B表示指數(shù)部分的偏移量(其值為B=[2e-1-1])。

IEEE標(biāo)準(zhǔn)規(guī)定,無論是float類型數(shù)據(jù)還是double類型數(shù)據(jù)在存儲(chǔ)中都分為3個(gè)部分:①符號(hào)位S:float類型和double類型都占1位,0代表正,1代表負(fù);②指數(shù)位E:float類型占8位,double類型占11位,用于存儲(chǔ)指數(shù)數(shù)據(jù),并且采用移位存儲(chǔ),指數(shù)采用移碼表示(原來的實(shí)際指數(shù)值加上一個(gè)固定值),該固定值為B=[2e-1-1](表示偏移量,e為指數(shù)部分比特長度,對(duì)于float類型,e=8,偏移量B=127;對(duì)于double類型,e=11,B=1 023)。指數(shù)位存儲(chǔ)的是一個(gè)無符號(hào)整數(shù),所以對(duì)于float類型,指數(shù)位E的取值范圍為0~255,其真正取值范圍為-127~128,對(duì)于double類型,指數(shù)位E的取值范圍為0~2 047,其真正取值范圍為-1 023~1 024;③尾數(shù)部分M:float類型占23位,double類型占52位。尾數(shù)采用原碼表示,用二進(jìn)制形式,整數(shù)部分為1,那么小數(shù)點(diǎn)前的1就沒有必要用一個(gè)比特位去存儲(chǔ),默認(rèn)已經(jīng)存在,稱為“隱藏位”。所以規(guī)定尾數(shù)部分在存儲(chǔ)時(shí)舍去第一個(gè)1,只存儲(chǔ)小數(shù)點(diǎn)之后的數(shù)字,好處是對(duì)于float類型,只保存23位小數(shù)信息,加上舍去的1,可以用來表示24個(gè)有效信息;對(duì)于double類型,可以用52位尾數(shù)部分表示53個(gè)有效信息。

浮點(diǎn)類型在內(nèi)存中由高地址到低地址分別存儲(chǔ)符號(hào)位S、指數(shù)位E和尾數(shù)部分M。指數(shù)位E還分為3種情況:①指數(shù)位E不全為0,不全為1。這是一種規(guī)范化的浮點(diǎn)數(shù)形式,此時(shí)就用正常的計(jì)算規(guī)則,指數(shù)部分E的真實(shí)值就是其字面值減去偏移量,尾數(shù)部分M的值要加上最前面省去的整數(shù)1;②指數(shù)位E全為0。需要分兩種情況進(jìn)行處理,若尾數(shù)部分M全為0,則表示浮點(diǎn)數(shù)0,若尾數(shù)部分M不全為0,則表示非規(guī)范化浮點(diǎn)數(shù)形式,表示很小的浮點(diǎn)數(shù),并且指數(shù)實(shí)際值為-(B-1)。對(duì)于float類型,指數(shù)實(shí)際值為-126。對(duì)于double類型,指數(shù)實(shí)際值為-1 022,尾數(shù)部分表示實(shí)際小數(shù)部分,整數(shù)部分為0(即沒有“隱藏位”1);③指數(shù)位E全為1。當(dāng)尾數(shù)部分M全為0時(shí),表示±無窮大(取決于符號(hào)位),當(dāng)M不全為0時(shí),表示該數(shù)不是一個(gè)數(shù)(NaN)。

本文主要研究C語言中浮點(diǎn)類型(包括單精度浮點(diǎn)類型float和雙精度浮點(diǎn)類型double)有效位數(shù)的計(jì)算、某個(gè)具體數(shù)值在內(nèi)存中的存儲(chǔ)形式、其所能表示的數(shù)據(jù)范圍以及在使用過程中的“反?!爆F(xiàn)象。在程序驗(yàn)證過程中,采用編譯軟件Visual C++6.0。

1 數(shù)值存儲(chǔ)形式查看

數(shù)值在內(nèi)存中的存儲(chǔ)形式,已有相關(guān)驗(yàn)證程序可以進(jìn)行查看[3,6,9,11,12]。在Intel CPU 架構(gòu)系統(tǒng)中,數(shù)據(jù)在內(nèi)存中的存放方式為小端模式(低字節(jié)存在低地址中,高字節(jié)存在高地址中)[3,21]。本文設(shè)計(jì)一個(gè)專門用來顯示某個(gè)變量在內(nèi)存中存儲(chǔ)形式以及按照指定形式進(jìn)行輸出的函數(shù)。

具體實(shí)現(xiàn)過程為:先建立頭文件“show.h”,然后在頭文件中定義實(shí)現(xiàn)查看內(nèi)存的函數(shù)displaymemory。

void displaymemory(void * a,int m,int n)

{

unsigned char *b=a,c,k[8]={1,2,4,8,16,32,64,128};?int i,j;?for(i=m-1;i>=0;i--)?{? ?c=*(b+i);? ?for(j=7;j>=0;j--)? ?{? ? ?printf("%2d",c/k[j]);? ? ?c=c%k[j];? ?}? ?printf("\n");?}

switch(n)

{

case 0:printf("%d\n",*(int *)a);break;

case 1:printf("%.20e\n",*(float *)a);break;

case 2:printf("%.20e\n",*(double *)a);break;

default:printf("Data error?。躰");

}

}

其中,函數(shù)displaymemory 中3個(gè)形參含義如下:void *a表示數(shù)據(jù)在內(nèi)存中存儲(chǔ)的起始地址;int m表示需要查看的內(nèi)存地址字節(jié)數(shù);int n表示用何種格式符輸出以地址a開始的數(shù)據(jù),如果n為0表示以d格式符輸出整數(shù),如果n為1表示以.20e格式符、指數(shù)形式輸出帶20位小數(shù)部分的float類型數(shù)據(jù),如果n為2表示以.20e格式符、指數(shù)形式輸出帶20位小數(shù)部分的double類型數(shù)據(jù)。

2 浮點(diǎn)數(shù)范圍與有效位數(shù)

2.1 浮點(diǎn)類型范圍

田祎、樊景博[10]對(duì)浮點(diǎn)類型數(shù)據(jù)范圍進(jìn)行了研究。本文主要按照規(guī)范化浮點(diǎn)數(shù)和非規(guī)范化浮點(diǎn)數(shù)各自取值范圍分別進(jìn)行討論。

規(guī)范化浮點(diǎn)數(shù)能夠表示的數(shù)其絕對(duì)值最大值為:對(duì)于float類型,指數(shù)位E為11111110,其表示的十進(jìn)制數(shù)為254-127=127,尾數(shù)部分M為全1,其對(duì)應(yīng)數(shù)據(jù)為[1.M*2127],所對(duì)應(yīng)的十進(jìn)制數(shù)約為[3.402 82*1038];對(duì)于double類型,指數(shù)位為11111111110,其表示的十進(jìn)制數(shù)為2 046-1 023=1 023,尾數(shù)部分M為全1,其對(duì)應(yīng)數(shù)據(jù)為[1.M*21 023],其所對(duì)應(yīng)的十進(jìn)制數(shù)約為[1.797 693 134 862 315 7*10308]。規(guī)范化浮點(diǎn)數(shù)能夠表示的絕對(duì)值最小非零數(shù)為:對(duì)于float類型,指數(shù)位E為00000001,表示的十進(jìn)制數(shù)為1-127=-126,尾數(shù)部分M為全0,對(duì)應(yīng)數(shù)據(jù)為[1*2-126],其所對(duì)應(yīng)的十進(jìn)制數(shù)約為[1.175 494 350 822 287 5*10-38];對(duì)于double類型,指數(shù)位為00000000001,表示的十進(jìn)制數(shù)為1-1 023=????? -1 022,尾數(shù)部分為全0,對(duì)應(yīng)數(shù)據(jù)為[1*2-1022],其所對(duì)應(yīng)的十進(jìn)制數(shù)約為[2.225 073 858 507 201 2*10-308]。浮點(diǎn)類型數(shù)據(jù)0.0在內(nèi)存中的表示形式為:指數(shù)位E和尾數(shù)部分M全為0。

非規(guī)范化浮點(diǎn)數(shù)指數(shù)位E為全0,尾數(shù)部分M不全為0。非規(guī)范化浮點(diǎn)數(shù)能夠表示的數(shù)其絕對(duì)值最大值為:對(duì)于float類型,指數(shù)位E為全0,尾數(shù)部分M為全1,此時(shí)沒有“隱藏位”1,指數(shù)部分的值為-126,其對(duì)應(yīng)數(shù)據(jù)為[0.M*2-126],十進(jìn)制數(shù)約為[1.175 494*10-38];對(duì)于double類型,指數(shù)位E為全0,尾數(shù)部分M為全1,此時(shí)沒有“隱藏位”1,指數(shù)部分的值為-1 022,其對(duì)應(yīng)數(shù)據(jù)為[0.M*2-1 022],十進(jìn)制數(shù)約為[2.225 073 858 507 200 9*10-308]。對(duì)于非規(guī)范化浮點(diǎn)數(shù),其能夠表示的非零數(shù)的絕對(duì)值最小值為:對(duì)于float類型,指數(shù)位E為全0,尾數(shù)部分M最后一位為1,其余全為0,此時(shí)沒有“隱藏位”1,指數(shù)部分的值為-126,其對(duì)應(yīng)數(shù)據(jù)為[1*2-23*2-126],十進(jìn)制數(shù)約為[1.401 298 464 324 817 1*][10-45];對(duì)于double類型,指數(shù)位E為全0,尾數(shù)部分M最后一位為1,其余全為0,此時(shí)沒有“隱藏位”1,指數(shù)部分值為-1 022,其對(duì)應(yīng)數(shù)據(jù)為[1*2-52*2-1 022],十進(jìn)制數(shù)約為[4.940 656 458 412 465 4*10-324]。非規(guī)范化浮點(diǎn)數(shù)所表示的數(shù)都很小,并且其有效數(shù)字的位數(shù)可能為0。

由浮點(diǎn)類型數(shù)據(jù)有關(guān)形式可知,當(dāng)指數(shù)位E全為1、尾數(shù)部分M全為0時(shí),表示無窮大;當(dāng)指數(shù)位E為全1、尾數(shù)部分M不全為0時(shí),表示不是一個(gè)數(shù)(NaN)。通過驗(yàn)證可知,對(duì)于float類型的數(shù)據(jù),當(dāng)數(shù)據(jù)范圍為[3.40282357e38,1.797693134862315e308]時(shí),表示無窮大,驗(yàn)證程序1如下:

#include

#include"show.h"

void main()

{

float b1=3.40282356e38,b2=3.40282357e38,b3=1.797693134862315e308;

displaymemory(&b1,4,2);

displaymemory(&b2,4,2);

displaymemory(&b3,4,2);

}

由驗(yàn)證結(jié)果可知,b1為最大的規(guī)范化float類型數(shù)據(jù),b2和b3在內(nèi)存中的表示形式相同,即指數(shù)位E為全1,尾數(shù)部分M為全0。

對(duì)于double類型的數(shù)據(jù),如果超過規(guī)范化雙精度浮點(diǎn)類型限制,編譯時(shí)會(huì)提示“constant too big”錯(cuò)誤,其無窮大能夠表示的數(shù)值范圍無法驗(yàn)證。

由驗(yàn)證程序1可得出以下結(jié)論:float類型在計(jì)算過程中都是按照double類型進(jìn)行處理的,如果表示的數(shù)超過了規(guī)范化float類型數(shù)據(jù)范圍并且在double類型數(shù)據(jù)范圍內(nèi),則按照float類型中的無窮大進(jìn)行處理;如果超過了double類型限制,則visual c++6.0編譯系統(tǒng)認(rèn)為輸入的數(shù)據(jù)太大,不能進(jìn)行處理。

2.2 浮點(diǎn)類型有效位數(shù)

張宗杰、張明亮[9]從相對(duì)誤差角度對(duì)浮點(diǎn)數(shù)的有效位數(shù)進(jìn)行了解讀,逯鴻友[20]對(duì)不同進(jìn)制之間轉(zhuǎn)換位數(shù)的確定給出了理論推導(dǎo)。本文從尾數(shù)的取值范圍和相對(duì)誤差兩方面進(jìn)行分析,對(duì)該問題進(jìn)行解釋和說明。

浮點(diǎn)數(shù)在內(nèi)存中的存放是離散的,而不是連續(xù)的,即對(duì)于每一個(gè)浮點(diǎn)數(shù)來說,其在內(nèi)存中表示的一個(gè)浮點(diǎn)類型數(shù)據(jù)都對(duì)應(yīng)一個(gè)區(qū)間。因此,浮點(diǎn)類型數(shù)據(jù)是有限個(gè)。由浮點(diǎn)數(shù)的存儲(chǔ)規(guī)范可知:對(duì)于非負(fù)float類型數(shù)據(jù)來說,其個(gè)數(shù)為[255*223];對(duì)于非負(fù)double類型數(shù)據(jù)來說,其個(gè)數(shù)為[2 047*252][8]。

對(duì)于規(guī)范化浮點(diǎn)類型,按照其能夠表示的二進(jìn)制位數(shù),可以計(jì)算出其最大相對(duì)誤差:對(duì)于float類型,當(dāng)尾數(shù)部分M為0全時(shí),取最大相對(duì)誤差值約為[0.5*2-23=2-24=][5.960 5e-08],當(dāng)尾數(shù)部分M為全1時(shí),取最小相對(duì)誤差值約為[0.5*0.5*2-23=2.980 2e-08];對(duì)于double類型,當(dāng)尾數(shù)部分為全0時(shí),取最大相對(duì)誤差值為[0.5*2-52=2-53],約為1.110 2e-16,當(dāng)尾數(shù)部分M為全1時(shí),取最小相對(duì)誤差值為[0.5*0.5*2-52],約為5.551 1e-17[8]。由相對(duì)誤差的計(jì)算結(jié)果可知,對(duì)于float類型,其有效數(shù)字位數(shù)最多為8,對(duì)于double類型,其有效數(shù)字位數(shù)最多為17。而對(duì)于非規(guī)范化浮點(diǎn)類型,其有效數(shù)字的位數(shù)是不同的,對(duì)于float類型,有效數(shù)字的位數(shù)為0~8,對(duì)于double類型,有效數(shù)字的位數(shù)為0~17,總體來說,有效數(shù)字的位數(shù)隨著尾數(shù)部分有效二進(jìn)制位增加而增加。

對(duì)有效數(shù)字位數(shù)的確定,主要與相對(duì)誤差的大小有關(guān)。由相對(duì)誤差計(jì)算結(jié)果可知,對(duì)于float類型,相對(duì)誤差主要影響從最高位開始的數(shù)字的第8位和第9位數(shù)字,前面7位數(shù)字在進(jìn)行四舍五入進(jìn)位前都是準(zhǔn)確的,有效數(shù)字的位數(shù)需要分以下3種情況進(jìn)行判斷:①如果內(nèi)存中表示為同一個(gè)float類型數(shù)據(jù)的取值范圍在第8位數(shù)字處相同,并且第9位數(shù)字取值范圍進(jìn)行四舍五入后與第8位數(shù)字相同,則該float類型數(shù)據(jù)有8位有效數(shù)字;②如果內(nèi)存中表示為同一個(gè)float類型數(shù)據(jù)的取值范圍在第8位數(shù)字處不相同,并且在同一個(gè)區(qū)域(0~4或者5~9),則該float類型數(shù)據(jù)有7位有效數(shù)字;③如果內(nèi)存中表示為同一個(gè)float類型數(shù)據(jù)的取值范圍在第8位數(shù)字處不相同,并且其取值范圍跨越兩個(gè)不同區(qū)域(0~4或者5~9),則第8位數(shù)字取值范圍影響到第7位數(shù)字的變化,并且變化后的值不同,則該float類型數(shù)據(jù)有6位有效數(shù)字。

從以上判斷過程可知,對(duì)于float類型,其有效數(shù)字的位數(shù)為6~8位。對(duì)于double類型,通過類似分析可知,其有效數(shù)字的位數(shù)為15~17位。

2.3 規(guī)范化浮點(diǎn)類型數(shù)據(jù)表示區(qū)間

2.3.1 理論分析

有關(guān)規(guī)范化浮點(diǎn)類型數(shù)據(jù)表示區(qū)間的問題,在文獻(xiàn)[1,7-11]中有相關(guān)說明,主要圍繞浮點(diǎn)數(shù)不能精確表示一個(gè)數(shù)從離散角度進(jìn)行了解釋。本文主要從浮點(diǎn)類型存儲(chǔ)形式對(duì)應(yīng)的理論數(shù)據(jù)范圍著手進(jìn)行研究。

使用Fmax表示float類型數(shù)據(jù)在內(nèi)存中存儲(chǔ)形式表示數(shù)據(jù)的最大偏移程度,使用Dmax表示double類型在內(nèi)存中存儲(chǔ)形式表示數(shù)據(jù)的最大偏移程度(對(duì)于給定的指數(shù)位E,無論是float類型還是double類型,其最大偏移程度表示為尾數(shù)部分M最后一位尾數(shù)為1時(shí)所表示數(shù)據(jù)的一半)。因此,F(xiàn)max=[0.5*2E-B-23=2E-B-24],Dmax=[0.5*2E-B-52=2E-B-53]。

浮點(diǎn)類型數(shù)據(jù)在內(nèi)存中存儲(chǔ)形式的確定過程如下:首先需要得到對(duì)應(yīng)的二進(jìn)制形式,即將十進(jìn)制浮點(diǎn)數(shù)轉(zhuǎn)換為24位二進(jìn)制形式,然后再進(jìn)行存儲(chǔ)。米保全[4]介紹了有關(guān)十進(jìn)制轉(zhuǎn)換為二進(jìn)制的技巧。對(duì)于整數(shù)部分,十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制的規(guī)則為:除2求余,商為下次的被除數(shù),先得到的余數(shù)為二進(jìn)制的低位部分,后得到的余數(shù)為二進(jìn)制的高位部分,直到商為0為止。對(duì)于小數(shù)部分,十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制的規(guī)則為:乘2取整,小數(shù)部分為下次的被乘數(shù),先得到的整數(shù)為二進(jìn)制的高位部分,后得到的整數(shù)為二進(jìn)制的低位部分,直到小數(shù)部分為0或者加上前面整數(shù)部分轉(zhuǎn)換的二進(jìn)制位超過了指定位數(shù)的二進(jìn)制為止(float類型為24位,double類型為53位)。最后計(jì)算結(jié)果,對(duì)于規(guī)范化float類型數(shù)據(jù)保留前面最高24位二進(jìn)制數(shù)字,對(duì)于規(guī)范化double類型數(shù)據(jù)保留前面最高的53位二進(jìn)制數(shù)字。多于指定位數(shù)的二進(jìn)制部分需要進(jìn)行向上進(jìn)位或者舍棄處理(通過驗(yàn)證程序2可知,按照就近原則靠攏,如果距離兩個(gè)數(shù)值相同,則采用進(jìn)位和舍棄交替進(jìn)行的方式處理)。

如果將非負(fù)浮點(diǎn)數(shù)在內(nèi)存中的形式從1開始按照自然數(shù)形式進(jìn)行編號(hào),1對(duì)應(yīng)內(nèi)存中存儲(chǔ)形式為0的數(shù)據(jù),2對(duì)應(yīng)最小正浮點(diǎn)數(shù),則對(duì)于float類型,當(dāng)指數(shù)位取值小于255時(shí),編號(hào)i取值范圍為[1,[255*223]]。通過驗(yàn)證程序2可知,編號(hào)i所能表示數(shù)的范圍可以用開、閉區(qū)間進(jìn)行表示:當(dāng)i為奇數(shù)時(shí),相應(yīng)內(nèi)存數(shù)據(jù)對(duì)應(yīng)的實(shí)際范圍為閉區(qū)間,否則為開區(qū)間。

對(duì)于float類型,編號(hào)i與對(duì)應(yīng)指數(shù)位E以及尾數(shù)部分M之間關(guān)系為:由于指數(shù)部分確定時(shí),其尾數(shù)部分出現(xiàn)的可能情況為[223],是偶數(shù),開閉區(qū)間交替出現(xiàn),所以編號(hào)i的開閉情況與指數(shù)位E無關(guān),只與尾數(shù)部分M的情況有關(guān)。如果把尾數(shù)部分M看作23位二進(jìn)制整數(shù),那么當(dāng)尾數(shù)部分M為偶數(shù)時(shí)是閉區(qū)間,當(dāng)尾數(shù)部分M為奇數(shù)時(shí)是開區(qū)間,即當(dāng)23位尾數(shù)部分的最后一位為0時(shí)是閉區(qū)間,當(dāng)其最后一位為1時(shí)是開區(qū)間。doulbe類型數(shù)據(jù)分析過程與此類似,不再贅述。

2.3.2 區(qū)間確定

由上述尾數(shù)與開閉區(qū)間之間關(guān)系以及內(nèi)存中存儲(chǔ)形式表示數(shù)的最大偏移程度,對(duì)于內(nèi)存中的任意存儲(chǔ)形式,其所對(duì)應(yīng)數(shù)據(jù)范圍也就確定下來了。目前的問題是如何確定最大偏移程度。

對(duì)于浮點(diǎn)類型,當(dāng)指數(shù)位確定時(shí),其最大偏移程度是確定的。對(duì)于float類型,F(xiàn)max=[2E-B-24];對(duì)于double類型,Dmax=[2E-B-53]。當(dāng)尾數(shù)部分不全為0時(shí),內(nèi)存中存儲(chǔ)數(shù)據(jù)對(duì)應(yīng)的浮點(diǎn)數(shù)t前后最大偏移程度是相同的。當(dāng)最后一位尾數(shù)部分為0時(shí),表示的數(shù)據(jù)范圍為閉區(qū)間,即對(duì)于float類型為[t-Fmax,t+Fmax],對(duì)于double類型為[t-Dmax,t+Dmax];當(dāng)最后一位尾數(shù)部分為1時(shí),表示的數(shù)據(jù)范圍為開區(qū)間。當(dāng)尾數(shù)部分為全0時(shí),其最大偏移程度與兩個(gè)相鄰指數(shù)位部分有關(guān)。對(duì)于相鄰兩個(gè)指數(shù)位E'和E=E'+1:對(duì)于float類型,F(xiàn)max=[2E-B-24],數(shù)據(jù)前面的最大偏移量為0.5*Fmax,數(shù)據(jù)后面的最大偏移量為Fmax,即對(duì)于float類型數(shù)據(jù)t,其所能表示的區(qū)間為[t-0.5*Fmax,t+Fmax];對(duì)于double類型,Dmax=[2E-B-53],其所能表示的區(qū)間為[t-0.5*Dmax,t+Dmax],即相鄰兩個(gè)指數(shù)部分的最大偏移量相差1倍。

浮點(diǎn)數(shù)不能精確地表示一個(gè)數(shù)字,規(guī)范化float類型數(shù)據(jù)有6~8位有效數(shù)字,double類型數(shù)據(jù)有15~17位有效數(shù)字,在計(jì)算一個(gè)內(nèi)存中存儲(chǔ)形式對(duì)應(yīng)的浮點(diǎn)數(shù)表示區(qū)間時(shí),一般情況下會(huì)與理論值有微小誤差。而且對(duì)于浮點(diǎn)數(shù),vc++6.0在計(jì)算過程中都是按照double類型進(jìn)行計(jì)算[1],而double類型所能表示的有效數(shù)字位數(shù)為15~17位,因此在表示float類型數(shù)據(jù)對(duì)應(yīng)的理論區(qū)間時(shí)需要按照double類型的計(jì)算過程進(jìn)行,即對(duì)于float類型數(shù)據(jù)的表示區(qū)間[a,b]或(a,b),對(duì)于a的表示,需要按照double類型數(shù)據(jù)對(duì)待,即只要區(qū)間[c,d]或(c,d)內(nèi)的值表示double類型a的值即可,類似可以得到對(duì)于b的取值范圍為[e,f]或(e,f)。從而可以得到對(duì)應(yīng)float類型數(shù)據(jù)的表示區(qū)間需要使用區(qū)間[c,f] (d,e)進(jìn)行表示,即對(duì)于float類型,當(dāng)尾數(shù)部分M不全為0、最后一位尾數(shù)部分為0時(shí),float類型數(shù)據(jù)t的理論區(qū)間為 [t-Fmax-Dmax,t+Fmax+Dmax],當(dāng)最后一位尾數(shù)部分不為0時(shí)為開區(qū)間,表示為(t-Fmax+Dmax,t+Fmax-Dmax),其中Fmax=[2E-B-24]為float類型下最大偏移量,Dmax=[2E-B-53]為對(duì)應(yīng)double類型下最大偏移量;當(dāng)尾數(shù)部分M為全0時(shí),對(duì)于相鄰兩個(gè)指數(shù)位E'和E=E'+1,則對(duì)于指數(shù)部分為E的第一個(gè)數(shù)值(即尾數(shù)部分M為全0),float類型數(shù)據(jù)t的理論區(qū)間為[t-0.5*Fmax-0.5*Dmax,t+Fmax+Dmax],其中Fmax=[2E-B-24]為float類型下最大偏移量,Dmax=[2E-B-53]為對(duì)應(yīng)double類型下最大偏移量。

因此,對(duì)于內(nèi)存中存儲(chǔ)形式對(duì)應(yīng)的float類型數(shù)據(jù)t,可以得出以下結(jié)論:

(1)當(dāng)尾數(shù)部分M全為0時(shí),內(nèi)存中存儲(chǔ)形式對(duì)應(yīng)數(shù)據(jù)t表示的數(shù)據(jù)區(qū)間為:

(2)當(dāng)尾數(shù)部分M不全為0并且最后一位為0時(shí),內(nèi)存中存儲(chǔ)形式對(duì)應(yīng)數(shù)據(jù)t表示的數(shù)據(jù)區(qū)間為:

(3)當(dāng)尾數(shù)部分M不全為0并且最后一位為1時(shí),內(nèi)存中存儲(chǔ)形式對(duì)應(yīng)數(shù)據(jù)t表示的數(shù)據(jù)區(qū)間為:

其中,F(xiàn)max=[2E-B-24]為float類型下的最大偏移量,Dmax=[2E-B-53]為對(duì)應(yīng)double類型下的最大偏移量。

2.3.3 區(qū)間驗(yàn)證

對(duì)于尾數(shù)部分全為0的float類型數(shù)據(jù),比如float類型數(shù)據(jù)167 772 16在內(nèi)存中進(jìn)行存儲(chǔ)時(shí),通過計(jì)算可知,其對(duì)應(yīng)的二進(jìn)制表示為1 00000000 00000000 00000000,即[224],在內(nèi)存中的存儲(chǔ)形式為01001011 10000000 00000000 00000000。167 772 15.5距離167 772 15與167 772 16相同,對(duì)167 772 16進(jìn)行向上進(jìn)位處理。由式(1)可知,其對(duì)應(yīng)的理論區(qū)間為[167 772 16-0.5*Fmax-0.5*Dmax,167 772 16+Fmax+Dmax],其中Fmax=[2151-127-24]=1,Dmax=[21 047-1 023-53]=1.862 6e-09,即理論區(qū)間值為[167 772 16-0.5*1-0.5*1.862 6e-09, 167 772 16+1.0+1.862 6e-09]。驗(yàn)證程序2如下:

#include

#include"show.h"

void main()

{

float b1=16777216-0.5-9.3133e-10,b2=16777216-0.5-9.3132e-10,

b3=16777216+1.0+1.8626e-09,b4=16777216+1.0+1.8627e-09;

displaymemory(&b1,4,1);

displaymemory(&b2,4,1);

displaymemory(&b3,4,1);

displaymemory(&b4,4,1);

}

從驗(yàn)證結(jié)果可知,b2和b3輸出的是float類型數(shù)據(jù)??? 167 772 16,而b1和b4輸出的不是該數(shù)據(jù),從而驗(yàn)證了上文理論結(jié)果是成立的。類似可以驗(yàn)證167 772 19距離??? 167 772 18和167 772 20相同,對(duì)167 772 20進(jìn)行向上進(jìn)位處理,167 772 21距離167 772 20和167 772 22相同,對(duì)?? 167 772 20進(jìn)行舍棄處理等。

對(duì)于尾數(shù)部分不全為0的float類型,比如,對(duì)于float類型數(shù)據(jù)838 860 9,通過計(jì)算可知其在內(nèi)存中的存儲(chǔ)形式為01001011 00000000 00000000 00000001,符號(hào)位S為0,表示正數(shù),指數(shù)位E存放的數(shù)對(duì)應(yīng)整數(shù)值為150,尾數(shù)部分M最后一位為1,其余全為0。則其在內(nèi)存中的存儲(chǔ)值為:[1*2150-127+1*2-23*2150-127]=838 860 9。由式(3)可知,其能夠表示的數(shù)據(jù)范圍通過計(jì)算可知為(838 860 9-Fmax+Dmax,838 860 9+Fmax-Dmax),其中Fmax=[2150-127-23-1]=0.5,Dmax=[21 046-1023-52-1]=9.313 2e-10,即(838 860 9-0.5-9.313 2e- 10,838 860 9+0.5+9.313 2e-10)。與驗(yàn)證程序2類似,可以驗(yàn)證該區(qū)間。

2.4 非規(guī)范化浮點(diǎn)類型數(shù)據(jù)有效數(shù)字位數(shù)

非規(guī)范化浮點(diǎn)類型有效數(shù)字位數(shù)與尾數(shù)部分高位處開始出現(xiàn)的1的位置有關(guān),從1開始到尾數(shù)部分結(jié)束的位數(shù)決定了對(duì)應(yīng)十進(jìn)制有效數(shù)字位數(shù)??傮w來說,從尾數(shù)部分高位處開始出現(xiàn)1的位置越靠前,有效數(shù)字的位數(shù)就越多,非規(guī)范化浮點(diǎn)類型表示非常小的數(shù)字。

比如,對(duì)于float類型數(shù)據(jù),其在內(nèi)存中的存儲(chǔ)形式為:00000000 00000000 00000000 00000001,即符號(hào)位S為0表示正,指數(shù)位E為全0表示真實(shí)指數(shù)值為-126,尾數(shù)部分M只有最后一位為1,其余全為0,該存儲(chǔ)形式通過計(jì)算可知其理論值為: [1*2-23*2-126=2-149],而對(duì)該數(shù)值的十進(jìn)制形式計(jì)算比較麻煩,因此,在下文驗(yàn)證過程中,采用對(duì)指定float類型數(shù)據(jù)存儲(chǔ)位置賦值的方式對(duì)該數(shù)據(jù)賦值,然后輸出該最小正float類型數(shù)據(jù)的指數(shù)形式,從而確定最小正float類型在內(nèi)存中的表示形式及其所對(duì)應(yīng)的十進(jìn)制指數(shù)形式。驗(yàn)證程序3如下:

#include?

typedef?struct?FP_SINGLE

{

??unsigned?__int32?M:23;

??unsigned?__int32?E:8;

??unsigned?__int32?S:1;

}?fp_single;

void?main()

{

float?x;

fp_single?*?fp_s=&x;

fp_s->S=0;

fp_s->E=0;

fp_s->M=1;

??printf("float最小正非規(guī)范數(shù):%le \n",x);

}

從運(yùn)行結(jié)果可知,最小正float類型所能表示的非規(guī)范化數(shù)據(jù)為1.4012984643248171e-045。由式(3)可知,該運(yùn)行結(jié)果表示的是一個(gè)范圍,其最大偏移程度為該數(shù)的一半。與驗(yàn)證程序2類似,將b1、b2、b3、b4分別初始化為:7.00649232162408613e-46、7.00649232162408614e-46、2.10194769648722545e-45、2.10194769648722546e-45,可以驗(yàn)證該理論區(qū)間。

由驗(yàn)證結(jié)果可知,b1和b4在內(nèi)存中存儲(chǔ)的是不同的數(shù)值,而b2和b3在內(nèi)存中存儲(chǔ)的是同一個(gè)值1.4012984643248171e-045,而b2-b3范圍內(nèi)的值與內(nèi)存中存儲(chǔ)的值相比,有效數(shù)字位數(shù)可能為0。

由上述驗(yàn)證結(jié)果可以得出以下結(jié)論:對(duì)于float類型數(shù)據(jù),其非規(guī)范化數(shù)據(jù)有效數(shù)字的位數(shù)可能為0,總體來說,隨著非規(guī)范化數(shù)值增大,其有效數(shù)字的位數(shù)也逐漸增多,直到增加到6~8位為止,即其有效數(shù)字的位數(shù)在0~8位之間。對(duì)于double類型數(shù)據(jù),其非規(guī)范化數(shù)據(jù)有效數(shù)字的位數(shù)也有類似結(jié)論,即其有效數(shù)字位數(shù)在0~17位之間。

3 浮點(diǎn)數(shù)使用注意問題

3.1 數(shù)據(jù)丟失與不能精確比較

對(duì)于浮點(diǎn)數(shù)在計(jì)算中的丟失現(xiàn)象,杜叔強(qiáng)等[12,13]給出了相關(guān)建議。本文主要從float類型在計(jì)算過程中以double類型進(jìn)行計(jì)算的角度進(jìn)行解釋和分析。

比如,float類型變量a=123 456 789 00,b=50;則a+b的結(jié)果不是123 456 789 50,在內(nèi)存中,a和b的存儲(chǔ)形式都是01010000 00110111 11110111 00000111,其值為???? 123 456 788 48,因?yàn)閍和b在計(jì)算時(shí)有效數(shù)字位數(shù)多于9位,不能精確存儲(chǔ)。該數(shù)123 456 789 00在內(nèi)存中存儲(chǔ)的值為123 456 788 48,該值加上50之后,沒有超過最大偏移量,還是123 456 788 48。通過計(jì)算可知,float類型數(shù)據(jù)123 456 788 48在內(nèi)存中存儲(chǔ)的指數(shù)位E為160,F(xiàn)max=[2160-127-23-1=29=512],Dmax=[21056-1023-52-1=2-20=][9.5367e-07],由式(3)可知,其表示的范圍為開區(qū)間(123 456 788 48-Fmax+Dmax,12345678848+Fmax-Dmax),即(123 456 788 48-512+9.5367e-07,123 456 788 48+512- 9.5367e-07),如果計(jì)算結(jié)果在該區(qū)間,則都會(huì)以???????????? 123 456 788 48進(jìn)行存儲(chǔ)和顯示。與驗(yàn)證程序2類似的過程,可以驗(yàn)證該區(qū)間。

由該現(xiàn)象可以得到一個(gè)結(jié)論:盡量不要使用兩個(gè)差別較大的浮點(diǎn)類型數(shù)據(jù)進(jìn)行運(yùn)算,否則會(huì)出現(xiàn)“大數(shù)吃小數(shù)”的現(xiàn)象。比較兩個(gè)數(shù)的差別,以較小數(shù)是否大于較大數(shù)的最大偏移量為準(zhǔn),如果較小數(shù)大于較大數(shù)的最大偏移量,則認(rèn)為兩個(gè)數(shù)差別不大,可以直接進(jìn)行運(yùn)算,否則,要盡量避免直接進(jìn)行運(yùn)算。

類似可以驗(yàn)證,只要一個(gè)數(shù)加上數(shù)據(jù)的絕對(duì)值小于該數(shù)在內(nèi)存中的最大偏移量,無論先后加上多少個(gè)該類數(shù)據(jù),都是該數(shù)據(jù)本身。驗(yàn)證程序4如下:

#include

#include"show.h"

void main()

{

float b=12345678848,b1;

int? i;

displaymemory(&b,4,1);

b1=b;

for(i=0;i<100;i++)b1=b1+500;

displaymemory(&b1,4,1);

}

從計(jì)算結(jié)果來看,b和b1輸出結(jié)果相同,因此要盡量避免進(jìn)行類似運(yùn)算,即盡量避免將一個(gè)較大數(shù)和一個(gè)較小數(shù)(較小數(shù)小于較大數(shù)在內(nèi)存中對(duì)應(yīng)存儲(chǔ)形式的最大偏移量)進(jìn)行運(yùn)算。

如果想讓較小數(shù)起作用,則需要多個(gè)較小數(shù)在同一個(gè)表達(dá)式中出現(xiàn),因?yàn)閒loat類型數(shù)據(jù)是按照double類型數(shù)據(jù)進(jìn)行計(jì)算的,double類型數(shù)據(jù)規(guī)范化形式有15~17位有效數(shù)字,可以將部分較小的數(shù)據(jù)保留下來,最后再將計(jì)算得到的double類型數(shù)據(jù)自動(dòng)轉(zhuǎn)換為float類型數(shù)據(jù)進(jìn)行保存。驗(yàn)證程序5如下:

#include

#include"show.h"

void main()

{

float b=12345678848,b1;

int? i;

displaymemory(&b,4,1);

b1=b+500+500;

displaymemory(&b1,4,1);

}

從計(jì)算結(jié)果來看,b和b1輸出結(jié)果不同,原因是對(duì)于b1的計(jì)算將b與多個(gè)較小數(shù)直接加在一起,在運(yùn)算時(shí)按照double類型進(jìn)行計(jì)算,因此能夠保留較多有效位數(shù),只要多個(gè)較小數(shù)加在一起超過了較大數(shù)的最大偏移量,就可以得到改變后的數(shù)。

由于浮點(diǎn)數(shù)表示的數(shù)據(jù)不精確,一定范圍內(nèi)數(shù)值在內(nèi)存中存儲(chǔ)的形式相同,因此應(yīng)該盡量避免兩個(gè)接近的浮點(diǎn)數(shù)進(jìn)行相等和不相等比較。比如兩個(gè)float類型的變量a=12345678900、b=12345678950,在進(jìn)行a==b的條件判斷時(shí)結(jié)果為真,因?yàn)閍和b在內(nèi)存中的存儲(chǔ)形式相同,認(rèn)為這兩個(gè)變量相等。驗(yàn)證程序6如下:

#include

#include"show.h"

void main()

{

float a=12345678900,b=12345678950;

if(a==b)printf("a==b\n");

else printf("a!=b\n");

}

從運(yùn)行結(jié)果來看,會(huì)輸出“a==b”,因?yàn)閷?duì)于浮點(diǎn)類型變量a和b,其在內(nèi)存中的存儲(chǔ)形式相同,因此條件“a==b”是成立的。所以,對(duì)于浮點(diǎn)類型變量,應(yīng)避免進(jìn)行相等和不相等的判斷。

3.2 不同類型數(shù)據(jù)輸出時(shí)出現(xiàn)反?,F(xiàn)象

C語言中常用的數(shù)據(jù)輸出格式符有d、c、f[1],對(duì)于不同數(shù)據(jù)類型需要使用不同格式符進(jìn)行輸出,如果不小心用了不該用的格式符,則輸出結(jié)果會(huì)與預(yù)期結(jié)果不同。字符型數(shù)據(jù)可以按照c格式符或者d格式符進(jìn)行輸出,分別按照字符形式或者對(duì)應(yīng)的十進(jìn)制整數(shù)形式進(jìn)行輸出;基本整型數(shù)據(jù)可以按照d格式符輸出其十進(jìn)制整數(shù)形式進(jìn)行輸出;f格式符用來輸出浮點(diǎn)類型數(shù)據(jù)的十進(jìn)制小數(shù)形式,如果要輸出指數(shù)形式,則以e格式符進(jìn)行輸出,f格式符和e格式符都默認(rèn)輸出6位小數(shù)部分。

如果數(shù)據(jù)輸出時(shí)沒有按照其正常格式符進(jìn)行輸出,則輸出結(jié)果按照對(duì)應(yīng)格式符存儲(chǔ)形式要求進(jìn)行輸出。比如:double a=2.5,printf(“%d\n”,*(int *) &a),輸出結(jié)果是0,因?yàn)?.5在內(nèi)存中按照double類型進(jìn)行存儲(chǔ),占8個(gè)字節(jié),其在內(nèi)存中的存儲(chǔ)形式為01000000 00000100 00000000 00000000 00000000 00000000 00000000 00000000,而輸出時(shí)按照后4個(gè)字節(jié)整數(shù)對(duì)應(yīng)的存儲(chǔ)形式規(guī)則進(jìn)行讀取。驗(yàn)證程序7如下:

#include

#include"show.h"

void main()

{

double a=2.5;

displaymemory(&a,8,2);

printf("%d\n",a);

}

如果把整數(shù)按照f格式符進(jìn)行輸出,將整數(shù)的地址按照浮點(diǎn)類型地址格式進(jìn)行讀取,則讀取過程中會(huì)按照浮點(diǎn)類型的規(guī)則進(jìn)行處理。比如:int a=655 36,printf(“%e\n”,a),變量a在內(nèi)存中的存儲(chǔ)形式為00000000 00000001 00000000 00000000。單精度浮點(diǎn)類型數(shù)據(jù)的輸出結(jié)果是9.1835496157991212e-041,而雙精度浮點(diǎn)類型(因?yàn)閒或e格式符默認(rèn)將相應(yīng)參數(shù)看作雙精度浮點(diǎn)類型數(shù)據(jù)進(jìn)行輸出)輸出結(jié)果是5.597333e-308。由前面浮點(diǎn)類型在內(nèi)存中存儲(chǔ)形式的規(guī)定可知:如果按照單精度浮點(diǎn)類型數(shù)據(jù)的處理方式進(jìn)行處理,該存儲(chǔ)形式對(duì)應(yīng)的單精度浮點(diǎn)數(shù)是一個(gè)非規(guī)范化浮點(diǎn)數(shù);如果按照雙精度浮點(diǎn)類型數(shù)據(jù)的處理方式進(jìn)行處理,需要變量a的地址和其前面4個(gè)字節(jié)的地址作為雙精度浮點(diǎn)類型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式進(jìn)行處理,由于變量a的地址前面4個(gè)字節(jié)存儲(chǔ)形式不固定,因此,得到雙精度浮點(diǎn)類型數(shù)據(jù)在不同運(yùn)行環(huán)境下一般是不同的,其測試存儲(chǔ)形式如下:00000000 00010010 11111111 11000000 00000000 00000001 00000000 00000000。驗(yàn)證程序8如下:

#include

#include"show.h"

void main()

{

int a=65536;

displaymemory(&a,8,2);

printf("%e\n",a);

}

因此,對(duì)于不同數(shù)據(jù)類型,需要使用其對(duì)應(yīng)的格式符進(jìn)行輸出格式控制,否則會(huì)按照對(duì)應(yīng)輸出格式的數(shù)據(jù)進(jìn)行處理和輸出。

4 結(jié)語

不同數(shù)據(jù)類型在計(jì)算機(jī)內(nèi)存中的存放方式不同,導(dǎo)致一些與整型類型不一樣的用法,比如數(shù)據(jù)有效位數(shù)限制、不能精確比較、“大數(shù)吃小數(shù)”等問題出現(xiàn)。只有了解不同數(shù)據(jù)的存儲(chǔ)長度和存儲(chǔ)形式,才能理解為什么有的計(jì)算結(jié)果與理論計(jì)算結(jié)果不同。杜叔強(qiáng)等[12,13]、周冠方[15]給出了浮點(diǎn)數(shù)使用注意事項(xiàng)。本文給出了浮點(diǎn)類型數(shù)據(jù)在內(nèi)存中不同形式對(duì)應(yīng)的理論取值區(qū)間,并通過實(shí)驗(yàn)驗(yàn)證了該區(qū)間的存在,在使用過程中需要根據(jù)遇到的不同情況加以處理。

由于浮點(diǎn)類型數(shù)據(jù)的有效位數(shù)有限(float類型為6~8位,double類型為15~17位),如果想得到更多有效位數(shù),比如對(duì)于π值的計(jì)算,想要得到小數(shù)點(diǎn)后100位有效數(shù)字,則按照現(xiàn)有數(shù)據(jù)類型無法得到,需要定義新的能夠表示更多有效位數(shù)的數(shù)據(jù)類型才能進(jìn)行。

參考文獻(xiàn):

[1] 譚浩強(qiáng). C程序設(shè)計(jì)(第四版)[M]. 北京:清華大學(xué)出版社, 2010.

[2] 向萬里,王智勇. C語言程序設(shè)計(jì)中關(guān)于補(bǔ)碼的幾個(gè)問題的探討[J]. 甘肅聯(lián)合大學(xué)學(xué)報(bào):自然科學(xué)版,2008(S1):6-8.

[3] 吳艷婷,方賢進(jìn). 數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的存儲(chǔ)形式及實(shí)驗(yàn)驗(yàn)證[J]. 安慶師范學(xué)院學(xué)報(bào):自然科學(xué)版,2016,22(4):152-154.

[4] 米保全. 基于計(jì)算機(jī)中進(jìn)制的轉(zhuǎn)換技巧[J]. 電子技術(shù)與軟件工程,2018(1):126.

[5] 楊翠芳. 淺談?dòng)?jì)算機(jī)基礎(chǔ)課程中數(shù)制的轉(zhuǎn)換問題[J]. 電子制作, 2014(18):72.

[6] 常玉紅,楊秀華. 巧用C語言指針驗(yàn)證數(shù)據(jù)的存儲(chǔ)方式[J]. 電腦知識(shí)與技術(shù),2007,3(14):393-397.

[7] 周恒忠. C語言實(shí)型數(shù)據(jù)的編碼和存儲(chǔ)[J]. 皖西學(xué)院學(xué)報(bào),2007,23(5):19-21.

[8] ZURAS D,COWLISHAW M,AIKEN A.IEEE standard for floating-point arithmetic[C].? IEEE Std 754-2008,2008:1-70.

[9] 張宗杰,張明亮. C語言中浮點(diǎn)數(shù)的存儲(chǔ)格式及其有效數(shù)字位數(shù)[J]. 計(jì)算機(jī)與數(shù)字工程, 2006,34(1):84-86.

[10] 田祎,樊景博. C語言中浮點(diǎn)數(shù)的表示范圍淺析[J]. 軟件工程,2016,19(4):8-10.

[11] 王力. 科學(xué)計(jì)算程序語言的浮點(diǎn)數(shù)機(jī)制研究[J]. 計(jì)算機(jī)科學(xué),2008,35(4):285-287.

[12] 杜叔強(qiáng). 淺析C語言中的浮點(diǎn)數(shù)[J]. 蘭州工業(yè)學(xué)院學(xué)報(bào),2010,17(5):26-28.

[13] 杜叔強(qiáng),施武祖. 浮點(diǎn)數(shù)用法分析[J]. 蘭州工業(yè)學(xué)院學(xué)報(bào),2012,19(3):51-53.

[14] 吳菊鳳,陳雪梨. 數(shù)制轉(zhuǎn)換過程中小數(shù)的“有限-無限”現(xiàn)象[J]. 紹興文理學(xué)院學(xué)報(bào):自然科學(xué)版, 2011,31(1):16-19.

[15] 周冠方C語言中浮點(diǎn)數(shù)精度問題分析[J]. 湖北工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報(bào), 2015(3):97-99.

[16] 程裕強(qiáng). 編程語言中浮點(diǎn)數(shù)精度丟失問題[J]. 計(jì)算機(jī)安全,2013(6):59-61.

[17] 陳愛民,毛莉珍.? Turbo C中兩個(gè)浮點(diǎn)數(shù)問題分析[J]. 寧德師范學(xué)院學(xué)報(bào):自然科學(xué)版, 2013,25(4):370-372.

[18] 李偉,余森,門佳. 浮點(diǎn)數(shù)存儲(chǔ)精度丟失問題——由學(xué)生提問所引發(fā)的思考[J]. 濮陽職業(yè)技術(shù)學(xué)院學(xué)報(bào),2015(3):151-153.

[19] 程寧,崔凱. C++浮點(diǎn)型數(shù)據(jù)存儲(chǔ)格式研究[J]. 南陽師范學(xué)院學(xué)報(bào),2010,9(9):59-62.

[20] 逯鴻友. 關(guān)于數(shù)制轉(zhuǎn)換中轉(zhuǎn)換位數(shù)的確定問題[J]. 牡丹江師范學(xué)院學(xué)報(bào):自然科學(xué)版, 2000(4):20-21.

[21] BAIDU. Little-endian[EB/OL].http://baike.baidu.com/view/2368412. htm.

(責(zé)任編輯:何 麗)

猜你喜歡
存儲(chǔ)單元
面向存儲(chǔ)空間受限的分揀系統(tǒng)內(nèi)多類型存儲(chǔ)單元數(shù)量配置
一種28 nm工藝下抗單粒子翻轉(zhuǎn)SRAM的12T存儲(chǔ)單元設(shè)計(jì)
一種新型密集堆垛式倉儲(chǔ)系統(tǒng)設(shè)計(jì)
一種FIFO的讀寫單元設(shè)計(jì)
一種成本更低的全新靜態(tài)DRAM存儲(chǔ)單元
MiR-125a-5p is Upregulated in Plasma of Residents from An Electronic Waste Recycling Site
OTP存儲(chǔ)器存儲(chǔ)單元內(nèi)寄生電容對(duì)讀取閾值的影響
極低電源電壓和極低功耗的亞閾值SRAM存儲(chǔ)單元設(shè)計(jì)
極低電源電壓和極低功耗的亞閾值SRAM存儲(chǔ)單元設(shè)計(jì)
洛川县| 达孜县| 金华市| 临湘市| 汉川市| 临海市| 桐柏县| 本溪市| 瓦房店市| 佛冈县| 陇南市| 大连市| 嵊泗县| 玉林市| 合水县| 大名县| 景德镇市| 迁西县| 中超| 都安| 天峻县| 贞丰县| 惠水县| 大余县| 承德县| 姚安县| 海林市| 青河县| 蒙阴县| 牙克石市| 乳源| 武强县| 禹城市| 朝阳区| 高密市| 容城县| 绥化市| 溧阳市| 宿迁市| 土默特左旗| 菏泽市|