国产一区二区av_放一下一级国产毛片_97国产孕妇精彩在线_中文字幕第30页_亚洲国产91在线一级毛片_av色国产精品喷浆_免费一级无码婬片aa片按摩店_日韩喷水色视频在线播放_色就是se94se人妻无码_国产二区AV办公室精品

IEEE 754浮點(diǎn)數(shù)標(biāo)準(zhǔn)詳解

作者: Herry.Han
發(fā)布于: 2021-12-25 21:49
閱讀: 543
分類: 公司新聞

IEEE 754浮點(diǎn)數(shù)標(biāo)準(zhǔn)詳解

http://c.biancheng.net/view/314.html

 

在計(jì)算機(jī)系統(tǒng)的發(fā)展過程中,業(yè)界曾經(jīng)提出過許多種實(shí)數(shù)的表達(dá)方法,比較典型的有相對(duì)于浮點(diǎn)數(shù)(Floating Point Number)的定點(diǎn)數(shù)(Fixed Point Number)。在定點(diǎn)數(shù)表達(dá)法中,其小數(shù)點(diǎn)固定地位于實(shí)數(shù)所有數(shù)字中間的某個(gè)位置。例如,貨幣的表達(dá)就可以采用這種表達(dá)方式,如 55.00 或者 00.55 可以用于表達(dá)具有 4 位精度,小數(shù)點(diǎn)后有兩位的貨幣值。由于小數(shù)點(diǎn)位置固定,所以可以直接用 4 位數(shù)值來表達(dá)相應(yīng)的數(shù)值。


但我們不難發(fā)現(xiàn),定點(diǎn)數(shù)表達(dá)法的缺點(diǎn)就在于其形式過于僵硬,固定的小數(shù)點(diǎn)位置決定了固定位數(shù)的整數(shù)部分和小數(shù)部分,不利于同時(shí)表達(dá)特別大的數(shù)或者特別小的數(shù)。因此,最終絕大多數(shù)現(xiàn)代的計(jì)算機(jī)系統(tǒng)都采納了所謂的浮點(diǎn)數(shù)表達(dá)法

浮點(diǎn)數(shù)表達(dá)法采用了科學(xué)計(jì)數(shù)法來表達(dá)實(shí)數(shù),即用一個(gè)有效數(shù)字。一個(gè)基數(shù)(Base)、一個(gè)指數(shù)(Exponent)以及一個(gè)表示正負(fù)的符號(hào)來表達(dá)實(shí)數(shù)。比如,666.66 用十進(jìn)制科學(xué)計(jì)數(shù)法可以表達(dá)為 6.6666×102(其中,6.6666 為有效數(shù)字,10 為基數(shù),2 為指數(shù))。浮點(diǎn)數(shù)利用指數(shù)達(dá)到了浮動(dòng)小數(shù)點(diǎn)的效果,從而可以靈活地表達(dá)更大范圍的實(shí)數(shù)。

當(dāng)然,對(duì)實(shí)數(shù)的浮點(diǎn)表示僅作如上的規(guī)定是不夠的,因?yàn)橥粚?shí)數(shù)的浮點(diǎn)表示還不是唯一的。例如,上面例子中的 666.66 可以表達(dá)為 0.66666×103、6.6666×102 或者 66.666×101 三種方式。因?yàn)檫@種表達(dá)的多樣性,因此有必要對(duì)其加以規(guī)范化以達(dá)到統(tǒng)一表達(dá)的目標(biāo)。規(guī)范的浮點(diǎn)數(shù)表達(dá)方式具有如下形式:


其中,d.dd…d 為有效數(shù)字,β 為基數(shù),e 為指數(shù)。

有效數(shù)字中數(shù)字的個(gè)數(shù)稱為精度,我們可以用 p 來表示,即可稱為 p 位有效數(shù)字精度。每個(gè)數(shù)字 d 介于 0 和基數(shù) β 之間,包括 0。更精確地說,±d0.d1d2…dp-1×βe 表示以下數(shù):


其中,對(duì)十進(jìn)制的浮點(diǎn)數(shù),即基數(shù) β 等于 10 的浮點(diǎn)數(shù)而言,上面的表達(dá)式非常容易理解。如 12.34,我們可以根據(jù)上面的表達(dá)式表達(dá)為:1×101+2×100+3×10-1+4×10-2,其規(guī)范浮點(diǎn)數(shù)表達(dá)為1.234×101。

但對(duì)二進(jìn)制來說,上面的表達(dá)式同樣可以簡(jiǎn)單地表達(dá)。唯一不同之處在于:二進(jìn)制的 β 等于 2,而每個(gè)數(shù)字 d 只能在 0 和 1 之間取值。如二進(jìn)制數(shù) 1001.101,我們可以根據(jù)上面的表達(dá)式表達(dá)為:1×23+0×22+0×21+1×20+1×2-1+0×2-2+1×2-3,其規(guī)范浮點(diǎn)數(shù)表達(dá)為 1.001101×23。

現(xiàn)在,我們就可以這樣簡(jiǎn)單地把二進(jìn)制轉(zhuǎn)換為十進(jìn)制,如二進(jìn)制數(shù) 1001.101 轉(zhuǎn)換成十進(jìn)制為:


由上面的等式,我們可以得出:向左移動(dòng)二進(jìn)制小數(shù)點(diǎn)一位相當(dāng)于這個(gè)數(shù)除以 2,而向右移動(dòng)二進(jìn)制小數(shù)點(diǎn)一位相當(dāng)于這個(gè)數(shù)乘以 2。如 101.11=3/4,而 10.111=7/8。除此之外,我們還可以得到這樣一個(gè)基本規(guī)律:一個(gè)十進(jìn)制小數(shù)要能用浮點(diǎn)數(shù)精確地表示,最后一位必須是 5(當(dāng)然這是必要條件,并非充分條件)。規(guī)律推演如下面的示例所示:


 
我們也可以使用一段 C 程序來驗(yàn)證:
  1. #include
  2. int main(void)
  3. {
  4. float f1=34.6;
  5. float f2=34.5;
  6. float f3=34.0;
  7. printf("34.6-34.0=%f\n",f1-f3);
  8. printf("34.5-34.0=%f\n",f2-f3);
  9. return 0;
  10. }
運(yùn)行結(jié)果為:
34.6-34.0=0.599998
34.5-34.0=0.500000

之所以“34.6-34.0=0.599998”,產(chǎn)生這個(gè)誤差的原因是 34.6 無法精確地表達(dá)為相應(yīng)的浮點(diǎn)數(shù),而只能保存為經(jīng)過舍入的近似值。而這個(gè)近似值與 34.0 之間的運(yùn)算自然無法產(chǎn)生精確的結(jié)果。

上面闡述了二進(jìn)制數(shù)轉(zhuǎn)換十進(jìn)制數(shù),如果你要將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),則需要把整數(shù)部分和小數(shù)部分分別轉(zhuǎn)換。其中,整數(shù)部分除以 2,取余數(shù);小數(shù)部分乘以 2,取整數(shù)位。如將 13.125 轉(zhuǎn)換成二進(jìn)制數(shù)如下:
1、首先轉(zhuǎn)換整數(shù)部分(13),除以 2,取余數(shù),所得結(jié)果為 1101。

2、其次轉(zhuǎn)換小數(shù)部分(0.125),乘以 2,取整數(shù)位。轉(zhuǎn)換過程如下:

0.125×2=0.25 取整數(shù)位0
0.25×2=0.5 取整數(shù)位0
0.5×2=1 取整數(shù)位1

3、小數(shù)部分所得結(jié)果為 001,即 13.125=1101.001,用規(guī)范浮點(diǎn)數(shù)表達(dá)為 1.101001×23。

除此之外,與浮點(diǎn)表示法相關(guān)聯(lián)的其他兩個(gè)參數(shù)是“最大允許指數(shù)”和“最小允許指數(shù)”,即 emax 和 emin。由于存在 βp 個(gè)可能的有效數(shù)字,以及 emax-emin+1 個(gè)可能的指數(shù),因此浮點(diǎn)數(shù)可以按 [log2(emax-emin+1)]+[log2p)]+1 位編碼,其中最后的 +1 用于符號(hào)位。

浮點(diǎn)數(shù)表示法

直到 20 世紀(jì) 80 年代(即在沒有制定 IEEE 754 標(biāo)準(zhǔn)之前),業(yè)界還沒有一個(gè)統(tǒng)一的浮點(diǎn)數(shù)標(biāo)準(zhǔn)。相反,很多計(jì)算機(jī)制造商根據(jù)自己的需要來設(shè)計(jì)自己的浮點(diǎn)數(shù)表示規(guī)則,以及浮點(diǎn)數(shù)的執(zhí)行運(yùn)算細(xì)節(jié)。另外,他們常常并不太關(guān)注運(yùn)算的精確性,而把實(shí)現(xiàn)的速度和簡(jiǎn)易性看得比數(shù)字的精確性更重要,而這就給代碼的可移植性造成了重大的障礙。

直到 1976 年,Intel 公司打算為其 8086 微處理器引進(jìn)一種浮點(diǎn)數(shù)協(xié)處理器時(shí),意識(shí)到作為芯片設(shè)計(jì)者的電子工程師和固體物理學(xué)家也許并不能通過數(shù)值分析來選擇最合理的浮點(diǎn)數(shù)二進(jìn)制格式。于是,他們邀請(qǐng)加州大學(xué)伯克利分校的 William Kahan 教授(當(dāng)時(shí)最優(yōu)秀的數(shù)值分析家)來為 8087 浮點(diǎn)處理器(FPU)設(shè)計(jì)浮點(diǎn)數(shù)格式。而這時(shí),William Kahan 教授又找來兩個(gè)專家協(xié)助他,于是就有了 KCS 組合(Kahn、Coonan和Stone),并共同完成了 Intel 公司的浮點(diǎn)數(shù)格式設(shè)計(jì)。

由于 Intel 公司的 KCS 浮點(diǎn)數(shù)格式完成得如此出色,以致 IEEE(Institute of Electrical and Electronics Engineers,電子電氣工程師協(xié)會(huì))決定采用一個(gè)非常接近 KCS 的方案作為 IEEE 的標(biāo)準(zhǔn)浮點(diǎn)格式。于是,IEEE 于 1985 年制訂了二進(jìn)制浮點(diǎn)運(yùn)算標(biāo)準(zhǔn) IEEE 754(IEEE Standard for Binary Floating-Point Arithmetic,ANSI/IEEE Std 754-1985),該標(biāo)準(zhǔn)限定指數(shù)的底為 2,并于同年被美國引用為 ANSI 標(biāo)準(zhǔn)。目前,幾乎所有的計(jì)算機(jī)都支持 IEEE 754 標(biāo)準(zhǔn),它大大地改善了科學(xué)應(yīng)用程序的可移植性。

考慮到 IBM System/370 的影響,IEEE 于 1987 年推出了與底數(shù)無關(guān)的二進(jìn)制浮點(diǎn)運(yùn)算標(biāo)準(zhǔn) IEEE 854,并于同年被美國引用為 ANSI 標(biāo)準(zhǔn)。1989 年,國際標(biāo)準(zhǔn)組織 IEC 批準(zhǔn) IEEE 754/854 為國際標(biāo)準(zhǔn) IEC 559:1989。后來經(jīng)修訂后,標(biāo)準(zhǔn)號(hào)改為 IEC 60559。現(xiàn)在,幾乎所有的浮點(diǎn)處理器完全或基本支持 IEC 60559。同時(shí),C99 的浮點(diǎn)運(yùn)算也支持 IEC 60559。

IEEE 浮點(diǎn)數(shù)標(biāo)準(zhǔn)是從邏輯上用三元組{S,E,M}來表示一個(gè)數(shù) V 的,即 V=(-1)S×M×2E,如圖1 所示。

圖 1
 
其中:
符號(hào)位 s(Sign)決定數(shù)是正數(shù)(s=0)還是負(fù)數(shù)(s=1),而對(duì)于數(shù)值 0 的符號(hào)位解釋則作為特殊情況處理。

有效數(shù)字位 M(Significand)是二進(jìn)制小數(shù),它的取值范圍為 1~2,或者為 0~1。它也被稱為尾數(shù)位(Mantissa)、系數(shù)位(Coefficient),甚至還被稱作“小數(shù)”。

指數(shù)位 E(Exponent)是 2 的冪(可能是負(fù)數(shù)),它的作用是對(duì)浮點(diǎn)數(shù)加權(quán)。

浮點(diǎn)數(shù)格式是一種數(shù)據(jù)結(jié)構(gòu),它規(guī)定了構(gòu)成浮點(diǎn)數(shù)的各個(gè)字段、這些字段的布局及算術(shù)解釋。IEEE 754 浮點(diǎn)數(shù)的數(shù)據(jù)位被劃分為三個(gè)段,從而對(duì)以上這些值進(jìn)行編碼。其中,一個(gè)單獨(dú)的符號(hào)位 s 直接編碼符號(hào) s;k 位的指數(shù)段 exp=ek-1…e1e0,編碼指數(shù) E;n 位的小數(shù)段 frac=fn-1…f1f0,編碼有效數(shù)字 M,但是被編碼的值也依賴于指數(shù)域的值是否等于 0。

根據(jù) exp 的值,被編碼的值可以分為如下幾種不同的情況。

1) 格式化值

當(dāng)指數(shù)段 exp 的位模式既不全為 0(即數(shù)值 0),也不全為 1(即單精度數(shù)值為 255,以單精度數(shù)為例, 8 位的指數(shù)為可以表達(dá) 0~255 的 255 個(gè)指數(shù)值;雙精度數(shù)值為 2047)的時(shí)候,就屬于這類情況。如圖 2 所示。


圖 2

我們知道,指數(shù)可以為正數(shù),也可以為負(fù)數(shù)。為了處理負(fù)指數(shù)的情況,實(shí)際的指數(shù)值按要求需要加上一個(gè)偏置(Bias)值作為保存在指數(shù)段中的值。因此,這種情況下的指數(shù)段被解釋為以偏置形式表示的有符號(hào)整數(shù)。即指數(shù)的值為:E=e-Bias

其中,e 是無符號(hào)數(shù),其位表示為 ek-1…e1e0,而 Bias 是一個(gè)等于 2k-1-1(單精度是 127,雙精度是 1023)的偏置值。由此產(chǎn)生指數(shù)的取值范圍是:?jiǎn)尉葹?-126~+127,雙精度為 -1022~+1023。

對(duì)小數(shù)段 frac,可解釋為描述小數(shù)值 f,其中 0≤f<1,其二進(jìn)制表示為 0.fn-1…f1f0,也就是二進(jìn)制小數(shù)點(diǎn)在最高有效位的左邊。有效數(shù)字定義為 M=1+f。有時(shí)候,這種方式也叫作隱含的以 1 開頭的表示法,因?yàn)槲覀兛梢园?M 看成一個(gè)二進(jìn)制表達(dá)式為 1.fn-1fn-2…f0 的數(shù)字。既然我們總是能夠調(diào)整指數(shù) E,使得有效數(shù)字 M 的范圍為 1≤M<2(假設(shè)沒有溢出),那么這種表示方法是一種輕松獲得一個(gè)額外精度位的技巧。同時(shí),由于第一位總是等于 1,因此我們就不需要顯式地表示它。拿單精度數(shù)為例,按照上面所介紹的知識(shí),實(shí)際上可以用 23 位長的有效數(shù)字來表達(dá) 24 位的有效數(shù)字。比如,對(duì)單精度數(shù)而言,二進(jìn)制的 1001.101(即十進(jìn)制的 9.625)可以表達(dá)為 1.001101×23,所以實(shí)際保存在有效數(shù)字位中的值為:

00110100000000000000000

即去掉小數(shù)點(diǎn)左側(cè)的 1,并用 0 在右側(cè)補(bǔ)齊。

根據(jù)上面所闡述的規(guī)則,下面以實(shí)數(shù) -9.625 為例,來看看如何將其表達(dá)為單精度的浮點(diǎn)數(shù)格式。具體轉(zhuǎn)換步驟如下:

1、首先,需要將 -9.625 用二進(jìn)制浮點(diǎn)數(shù)表達(dá)出來,然后變換為相應(yīng)的浮點(diǎn)數(shù)格式。即 -9.625 的二進(jìn)制為 1001.101,用規(guī)范的浮點(diǎn)數(shù)表達(dá)應(yīng)為 1.001101×23。

2、其次,因?yàn)?-9.625 是負(fù)數(shù),所以符號(hào)段為 1。而這里的指數(shù)為 3,所以指數(shù)段為 3+127=130,即二進(jìn)制的 10000010。有效數(shù)字省略掉小數(shù)點(diǎn)左側(cè)的 1 之后為 001101,然后在右側(cè)用零補(bǔ)齊。因此所得的最終結(jié)果為:


 
3、最后,我們還可以將浮點(diǎn)數(shù)形式表示為十六進(jìn)制的數(shù)據(jù),如下所示:


即最終的十六進(jìn)制結(jié)果為 0xC11A0000。

2) 特殊數(shù)值

IEEE 標(biāo)準(zhǔn)指定了以下特殊值:±0、反向規(guī)格化的數(shù)、±∞ 和 NaN(如下表所示)。這些特殊值都是使用 emax+1 或 emin-1 的指數(shù)進(jìn)行編碼的。


 
NaN:當(dāng)指數(shù)段 exp 全為 1 時(shí),小數(shù)段為非零時(shí),結(jié)果值就被稱為“NaN”(Not any Number),如圖 3 所示。


圖 3

一般情況下,我們將 0/0 或:


視為導(dǎo)致計(jì)算終止的不可恢復(fù)錯(cuò)誤。但是,一些示例表明在這樣的情況下繼續(xù)進(jìn)行計(jì)算是有意義的。這時(shí)候就可以通過引入特殊值 NaN,并指定諸如 0/0 或


之類的表達(dá)式計(jì)算來生成 NaN 而不是停止計(jì)算,從而避免此問題。下表中列出了一些可以導(dǎo)致 NaN 的情況。


無窮:當(dāng)指數(shù)段 exp 全為 1,小數(shù)段全為 0 時(shí),得到的值表示無窮。當(dāng) s=0 時(shí)是 +∞,或者當(dāng) s=1 時(shí)是 -∞。如圖 4 所示。


圖 4

無窮用于表達(dá)計(jì)算中產(chǎn)生的上溢問題。比如兩個(gè)極大的數(shù)相乘時(shí),盡管兩個(gè)操作數(shù)本身可以保存為浮點(diǎn)數(shù),但其結(jié)果可能大到無法保存為浮點(diǎn)數(shù),必須進(jìn)行舍入操作。根據(jù)IEEE標(biāo)準(zhǔn),此時(shí)不能將結(jié)果舍入為可以保存的最大浮點(diǎn)數(shù)(因?yàn)檫@個(gè)數(shù)可能與實(shí)際的結(jié)果相差太遠(yuǎn)而毫無意義),而應(yīng)將其舍入為無窮。對(duì)于結(jié)果為負(fù)數(shù)的情況也是如此,只不過此時(shí)會(huì)舍入為負(fù)無窮,也就是說符號(hào)域?yàn)?的無窮。

3) 非格式化值

當(dāng)指數(shù)段 exp 全為 0 時(shí),所表示的數(shù)就是非規(guī)格化形式,如圖 5 所示。


圖 5

在這種情況下,指數(shù)值 E=1-Bias,而有效數(shù)字的值 M=f,也就是說它是小數(shù)段的值,不包含隱含的開頭的 1。

非規(guī)格化值有兩個(gè)用途:

第一,它提供了一種表示數(shù)值 0 的方法。因?yàn)橐?guī)格化數(shù)必須得使有效數(shù)字 M 在范圍 1≤M<2 之中,即 M≥1,因此它就不能表示 0。實(shí)際上,+0.0 的浮點(diǎn)表示的位模式為全 0(即符號(hào)位是 0,指數(shù)段全為 0,而小數(shù)段也全為 0),這就得到 M=f=0。令人奇怪的是,當(dāng)符號(hào)位為 1,而其他段全為 0 時(shí),就會(huì)得到值 -0.0。根據(jù) IEEE 的浮點(diǎn)格式來看,值 +0.0 和 -0.0 在某些方面是不同的。

第二,它表示那些非常接近于 0.0 的數(shù)。它們提供了一種屬性,稱為逐漸下溢出。其中,可能的數(shù)值分布均勻地接近于 0.0。

下面的單精度浮點(diǎn)數(shù)就是一個(gè)非格式化的示例。

它被轉(zhuǎn)換成十進(jìn)制表示大約等于 1.4×10-45,實(shí)際上它就是單精度浮點(diǎn)數(shù)所能表達(dá)的最小非格式化數(shù)。以此類推,格式化值和非格式化值所能表達(dá)的非負(fù)數(shù)值范圍如下表所示。

標(biāo)準(zhǔn)浮點(diǎn)格式

IEEE 754標(biāo)準(zhǔn)準(zhǔn)確地定義了單精度和雙精度浮點(diǎn)格式,并為這兩種基本格式分別定義了擴(kuò)展格式,如下所示:
  • 單精度浮點(diǎn)格式(32 位)。
  • 雙精度浮點(diǎn)格式(64 位)。
  • 擴(kuò)展單精度浮點(diǎn)格式(≥43 位,不常用)。
  • 擴(kuò)展雙精度浮點(diǎn)格式(≥79 位,一般情況下,Intel x86 結(jié)構(gòu)的計(jì)算機(jī)采用的是 80 位,而 SPARC 結(jié)構(gòu)的計(jì)算機(jī)采用的是 128 位)。
其中,只有 32 位單精度浮點(diǎn)數(shù)是本標(biāo)準(zhǔn)強(qiáng)烈要求支持的,其他都是可選部分。下面就來對(duì)單精度浮點(diǎn)與雙精度浮點(diǎn)的存儲(chǔ)格式做一些簡(jiǎn)要的闡述。

1) 單精度浮點(diǎn)格式

單精度浮點(diǎn)格式共 32 位,其中,s、exp 和 frac 段分別為 1 位、k=8 位和 n=23 位,如圖 6 所示。


圖 6

其中,32 位中的第 0 位存放小數(shù)段 frac 的最低有效位 LSB(least significant bit),第 22 位存放小數(shù)段 frac 的最高有效位 MSB(most significant bit);第 23 位存放指數(shù)段 exp 的最低有效位 LSB,第 30 位存放指數(shù)段 exp 的最高有效位 MSB;最高位,即第 31 位存放符號(hào) s。例如,單精度數(shù) 8.25 的存儲(chǔ)方式如圖 7 所示。


圖 7

2) 雙精度浮點(diǎn)格式

雙精度浮點(diǎn)格式共 64 位,其中,s、exp 和 frac 段分別為 1 位、k=11 位和 n=52 位,如圖 8 所示。


圖 8

其中,frac[31:0] 存放小數(shù)段的低 32 位(即第 0 位存放整個(gè)小數(shù)段的最低有效位 LSB,第 31 位存放小數(shù)段低 32 位的最高有效位 MSB);frac[51:32] 存放小數(shù)段的高 20 位(即第 32 位存放高 20 位的最低有效位 LSB,第 51 位存放整個(gè)小數(shù)段的最高有效位 MSB);第 52 位存放指數(shù)段 exp 的最低有效位 LSB,第 62 位存放指數(shù)段 exp 的最高有效位 MSB;最高位,即第 63 位存放符號(hào) s。

在 Intel x86 結(jié)構(gòu)的計(jì)算機(jī)中,數(shù)據(jù)存放采用的是小端法(Little Endian),故較低地址的 32 位的字中存放小數(shù)段的 frac[31:0] 位。而在 SPARC 結(jié)構(gòu)的計(jì)算機(jī)中,因其數(shù)據(jù)存放采用的是大端法(Big Endian),故較高地址的 32 位字中存放小數(shù)段的 frac[31:0] 位。

前面主要討論了 IEEE 754 的單精度與雙精度浮點(diǎn)格式,下表對(duì)浮點(diǎn)數(shù)的相關(guān)參數(shù)進(jìn)行了總結(jié),有興趣的讀者可以根據(jù)此表對(duì)其他浮點(diǎn)格式進(jìn)行深入解讀。

舍入誤差

舍入誤差是指運(yùn)算得到的近似值和精確值之間的差異。大家知道,由于計(jì)算機(jī)的字長有限,因此在進(jìn)行數(shù)值計(jì)算的過程中,對(duì)計(jì)算得到的中間結(jié)果數(shù)據(jù)要使用相關(guān)的舍入規(guī)則來取近似值,而這導(dǎo)致計(jì)算結(jié)果產(chǎn)生誤差。

在浮點(diǎn)數(shù)的舍入問題上,IEEE 浮點(diǎn)格式定義了 4 種不同的舍入方式,如下表所示。其中,默認(rèn)的舍入方法是向偶數(shù)舍入,而其他三種可用于計(jì)算上界和下界。
 

下表是 4 種舍入方式的應(yīng)用舉例。這里需要特別說明的是,向偶數(shù)舍入(向最接近的值舍入)方式會(huì)試圖找到一個(gè)最接近的匹配值。因此,它將 1.4 舍入成 1,將 1.6 舍入成 2,而將 1.5 和 2.5 都舍入成 2。


或許看了上面的內(nèi)容你會(huì)問:為什么要采用向偶數(shù)舍入這樣的舍入策略,而不直接使用我們已經(jīng)習(xí)慣的“四舍五入”呢?

其原因我們可以這樣來理解:在進(jìn)行舍入的時(shí)候,最后一位數(shù)字從 1 到 9,舍去的有 1、2、3、4;它正好可以和進(jìn)位的 9、8、7、6 相對(duì)應(yīng),而 5 卻被單獨(dú)留下。如果我們采用四舍五入每次都將 5 進(jìn)位的話,在進(jìn)行一些大量數(shù)據(jù)的統(tǒng)計(jì)時(shí),就會(huì)累積比較大的偏差。而如果采用向偶數(shù)舍入的策略,在大多數(shù)情況下,5 舍去還是進(jìn)位概率是差不多的,統(tǒng)計(jì)時(shí)產(chǎn)生的偏差也就相應(yīng)要小一些。

同樣,針對(duì)浮點(diǎn)數(shù)據(jù),向偶數(shù)舍入方式只需要簡(jiǎn)單地考慮最低有效數(shù)字是奇數(shù)還是偶數(shù)即可。例如,假設(shè)我們想將十進(jìn)制數(shù)舍入到最接近的百分位。不管用哪種舍入方式,我們都將把 1.2349999 舍入到 1.23,而將 1.2350001 舍入到 1.24,因?yàn)樗鼈儾皇窃?1.23 和 1.24 的正中間。另一方面我們將把兩個(gè)數(shù) 1.2350000 和 1.2450000 都舍入到 1.24,因?yàn)?4 是偶數(shù)。

由IEEE浮點(diǎn)格式定義的舍入方式可知,不論使用哪種舍入方式,都會(huì)產(chǎn)生舍入誤差。如果在一系列運(yùn)算中的一步或幾步產(chǎn)生了舍入誤差,在某些情況下,這個(gè)誤差將會(huì)隨著運(yùn)算次數(shù)的增加而積累得很大,最終會(huì)得出沒有意義的運(yùn)算結(jié)果。因此,建議不要將浮點(diǎn)數(shù)用于精確計(jì)算。

當(dāng)然,理論上增加數(shù)字位數(shù)可以減少可能會(huì)產(chǎn)生的舍入誤差。但是,位數(shù)是有限的,在表示無限浮點(diǎn)數(shù)時(shí)仍然會(huì)產(chǎn)生誤差。在用常規(guī)方法表示浮點(diǎn)數(shù)的情況下,這種誤差是不可避免的,但是可以通過設(shè)置警戒位來減小。

除此之外,IEEE 754 還提出 5 種類型的浮點(diǎn)異常,即上溢、下溢、除以零、無效運(yùn)算和不精確。其中,每類異常都有單獨(dú)的狀態(tài)標(biāo)志。鑒于篇幅有限,本節(jié)就不再詳細(xì)介紹。

關(guān)注微信公眾號(hào)「站長嚴(yán)長生」,在手機(jī)上閱讀所有教程,隨時(shí)隨地都能學(xué)習(xí)。本公眾號(hào)由C語言中文網(wǎng)站長運(yùn)營,每日更新,堅(jiān)持原創(chuàng),敢說真話,凡事有態(tài)度。

分享