西门子实数类型介绍
直到 20 世紀(jì) 80 年代(即在沒有制定 IEEE 754 標(biāo)準(zhǔn)之前),業(yè)界還沒有一個統(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)的速度和簡易性看得比數(shù)字的精確性更重要,而這就給代碼的可移植性造成了重大的障礙。
直到 1976 年,Intel 公司打算為其 8086 微處理器引進(jìn)一種浮點(diǎn)數(shù)協(xié)處理器時,意識到作為芯片設(shè)計(jì)者的電子工程師和固體物理學(xué)家也許并不能通過數(shù)值分析來選擇最合理的浮點(diǎn)數(shù)二進(jìn)制格式。于是,他們邀請加州大學(xué)伯克利分校的 William Kahan 教授(當(dāng)時最優(yōu)秀的數(shù)值分析家)來為 8087 浮點(diǎn)處理器(FPU)設(shè)計(jì)浮點(diǎn)數(shù)格式。而這時,William Kahan 教授又找來兩個專家協(xié)助他,于是就有了 KCS 組合(Kahn、Coonan和Stone),并共同完成了 Intel 公司的浮點(diǎn)數(shù)格式設(shè)計(jì)。
由于 Intel 公司的 KCS 浮點(diǎn)數(shù)格式完成得如此出色,以致 IEEE(Institute of Electrical and Electronics Engineers,電子電氣工程師協(xié)會)決定采用一個非常接近 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)號改為 IEC 60559?,F(xiàn)在,幾乎所有的浮點(diǎn)處理器完全或基本支持 IEC 60559。同時,C99 的浮點(diǎn)運(yùn)算也支持 IEC 60559。
IEEE 浮點(diǎn)數(shù)標(biāo)準(zhǔn)是從邏輯上用三元組{S,E,M}來表示一個數(shù) V 的,即 V=(-1)S×M×2E,如圖1 所示。
圖 1
?
其中:
符號位 s(Sign)決定數(shù)是正數(shù)(s=0)還是負(fù)數(shù)(s=1),而對于數(shù)值 0 的符號位解釋則作為特殊情況處理。
有效數(shù)字位 M(Significand)是二進(jìn)制小數(shù),它的取值范圍為 1~2-ε,或者為 0~1-ε。它也被稱為尾數(shù)位(Mantissa)、系數(shù)位(Coefficient),甚至還被稱作“小數(shù)”。
指數(shù)位 E(Exponent)是 2 的冪(可能是負(fù)數(shù)),它的作用是對浮點(diǎn)數(shù)加權(quán)。
浮點(diǎn)數(shù)格式是一種數(shù)據(jù)結(jié)構(gòu),它規(guī)定了構(gòu)成浮點(diǎn)數(shù)的各個字段、這些字段的布局及算術(shù)解釋。IEEE 754 浮點(diǎn)數(shù)的數(shù)據(jù)位被劃分為三個段,從而對以上這些值進(jìn)行編碼。其中,一個單獨(dú)的符號位 s 直接編碼符號 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 個指數(shù)值;雙精度數(shù)值為 2047)的時候,就屬于這類情況。如圖 2 所示。
圖 2
我們知道,指數(shù)可以為正數(shù),也可以為負(fù)數(shù)。為了處理負(fù)指數(shù)的情況,實(shí)際的指數(shù)值按要求需要加上一個偏置(Bias)值作為保存在指數(shù)段中的值。因此,這種情況下的指數(shù)段被解釋為以偏置形式表示的有符號整數(shù)。即指數(shù)的值為:E=e-Bias
其中,e 是無符號數(shù),其位表示為 ek-1…e1e0,而 Bias 是一個等于 2k-1-1(單精度是 127,雙精度是 1023)的偏置值。由此產(chǎn)生指數(shù)的取值范圍是:單精度為 -126~+127,雙精度為 -1022~+1023。
對小數(shù)段 frac,可解釋為描述小數(shù)值 f,其中 0≤f<1,其二進(jìn)制表示為 0.fn-1…f1f0,也就是二進(jìn)制小數(shù)點(diǎn)在最高有效位的左邊。有效數(shù)字定義為 M=1+f。有時候,這種方式也叫作隱含的以 1 開頭的表示法,因?yàn)槲覀兛梢园?M 看成一個二進(jìn)制表達(dá)式為 1.fn-1fn-2…f0?的數(shù)字。既然我們總是能夠調(diào)整指數(shù) E,使得有效數(shù)字 M 的范圍為 1≤M<2(假設(shè)沒有溢出),那么這種表示方法是一種輕松獲得一個額外精度位的技巧。同時,由于第一位總是等于 1,因此我們就不需要顯式地表示它。拿單精度數(shù)為例,按照上面所介紹的知識,實(shí)際上可以用 23 位長的有效數(shù)字來表達(dá) 24 位的有效數(shù)字。比如,對單精度數(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ù),所以符號段為 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。
先將實(shí)數(shù)由十進(jìn)制轉(zhuǎn)換為二進(jìn)制數(shù)
例?5865.236
整數(shù)部分:5865? =BIN?1 0110 1110 1001
小數(shù)部分:.236? ?=BIN 00111100011010100111111
5865.236=1.0110 1110 1001 ,001111000110101
利用上述工程,使用科學(xué)計(jì)數(shù)法記錄
5865.236=1,0110 1110 1001111000110101x212
12+127=139? 二進(jìn)制表示為10001011,
故指數(shù)部分表示為10001011
小數(shù)部分為科學(xué)計(jì)數(shù)法的后23位
即0110 1110 1001111000110101
5865.23=0? ?10001011? ? ??01101110100100111100011
? ? ? ?符號位? ? ? ? 指數(shù)位? ? ? ? ? ? ?小數(shù)位
?
?
?
總結(jié)
- 上一篇: (CVE-2014-0160)OpenS
- 下一篇: 智联招聘如何设置公司屏蔽