西门子实数类型介绍
直到 20 世紀 80 年代(即在沒有制定 IEEE 754 標準之前),業界還沒有一個統一的浮點數標準。相反,很多計算機制造商根據自己的需要來設計自己的浮點數表示規則,以及浮點數的執行運算細節。另外,他們常常并不太關注運算的精確性,而把實現的速度和簡易性看得比數字的精確性更重要,而這就給代碼的可移植性造成了重大的障礙。
直到 1976 年,Intel 公司打算為其 8086 微處理器引進一種浮點數協處理器時,意識到作為芯片設計者的電子工程師和固體物理學家也許并不能通過數值分析來選擇最合理的浮點數二進制格式。于是,他們邀請加州大學伯克利分校的 William Kahan 教授(當時最優秀的數值分析家)來為 8087 浮點處理器(FPU)設計浮點數格式。而這時,William Kahan 教授又找來兩個專家協助他,于是就有了 KCS 組合(Kahn、Coonan和Stone),并共同完成了 Intel 公司的浮點數格式設計。
由于 Intel 公司的 KCS 浮點數格式完成得如此出色,以致 IEEE(Institute of Electrical and Electronics Engineers,電子電氣工程師協會)決定采用一個非常接近 KCS 的方案作為 IEEE 的標準浮點格式。于是,IEEE 于 1985 年制訂了二進制浮點運算標準 IEEE 754(IEEE Standard for Binary Floating-Point Arithmetic,ANSI/IEEE Std 754-1985),該標準限定指數的底為 2,并于同年被美國引用為 ANSI 標準。目前,幾乎所有的計算機都支持 IEEE 754 標準,它大大地改善了科學應用程序的可移植性。
考慮到 IBM System/370 的影響,IEEE 于 1987 年推出了與底數無關的二進制浮點運算標準 IEEE 854,并于同年被美國引用為 ANSI 標準。1989 年,國際標準組織 IEC 批準 IEEE 754/854 為國際標準 IEC 559:1989。后來經修訂后,標準號改為 IEC 60559。現在,幾乎所有的浮點處理器完全或基本支持 IEC 60559。同時,C99 的浮點運算也支持 IEC 60559。
IEEE 浮點數標準是從邏輯上用三元組{S,E,M}來表示一個數 V 的,即 V=(-1)S×M×2E,如圖1 所示。
圖 1
?
其中:
符號位 s(Sign)決定數是正數(s=0)還是負數(s=1),而對于數值 0 的符號位解釋則作為特殊情況處理。
有效數字位 M(Significand)是二進制小數,它的取值范圍為 1~2-ε,或者為 0~1-ε。它也被稱為尾數位(Mantissa)、系數位(Coefficient),甚至還被稱作“小數”。
指數位 E(Exponent)是 2 的冪(可能是負數),它的作用是對浮點數加權。
浮點數格式是一種數據結構,它規定了構成浮點數的各個字段、這些字段的布局及算術解釋。IEEE 754 浮點數的數據位被劃分為三個段,從而對以上這些值進行編碼。其中,一個單獨的符號位 s 直接編碼符號 s;k 位的指數段 exp=ek-1…e1e0,編碼指數 E;n 位的小數段 frac=fn-1…f1f0,編碼有效數字 M,但是被編碼的值也依賴于指數域的值是否等于 0。
根據 exp 的值,被編碼的值可以分為如下幾種不同的情況。
1) 格式化值
當指數段 exp 的位模式既不全為 0(即數值 0),也不全為 1(即單精度數值為 255,以單精度數為例, 8 位的指數為可以表達 0~255 的 255 個指數值;雙精度數值為 2047)的時候,就屬于這類情況。如圖 2 所示。
圖 2
我們知道,指數可以為正數,也可以為負數。為了處理負指數的情況,實際的指數值按要求需要加上一個偏置(Bias)值作為保存在指數段中的值。因此,這種情況下的指數段被解釋為以偏置形式表示的有符號整數。即指數的值為:E=e-Bias
其中,e 是無符號數,其位表示為 ek-1…e1e0,而 Bias 是一個等于 2k-1-1(單精度是 127,雙精度是 1023)的偏置值。由此產生指數的取值范圍是:單精度為 -126~+127,雙精度為 -1022~+1023。
對小數段 frac,可解釋為描述小數值 f,其中 0≤f<1,其二進制表示為 0.fn-1…f1f0,也就是二進制小數點在最高有效位的左邊。有效數字定義為 M=1+f。有時候,這種方式也叫作隱含的以 1 開頭的表示法,因為我們可以把 M 看成一個二進制表達式為 1.fn-1fn-2…f0?的數字。既然我們總是能夠調整指數 E,使得有效數字 M 的范圍為 1≤M<2(假設沒有溢出),那么這種表示方法是一種輕松獲得一個額外精度位的技巧。同時,由于第一位總是等于 1,因此我們就不需要顯式地表示它。拿單精度數為例,按照上面所介紹的知識,實際上可以用 23 位長的有效數字來表達 24 位的有效數字。比如,對單精度數而言,二進制的 1001.101(即十進制的 9.625)可以表達為 1.001101×23,所以實際保存在有效數字位中的值為:
00110100000000000000000
即去掉小數點左側的 1,并用 0 在右側補齊。
根據上面所闡述的規則,下面以實數 -9.625 為例,來看看如何將其表達為單精度的浮點數格式。具體轉換步驟如下:
1、首先,需要將 -9.625 用二進制浮點數表達出來,然后變換為相應的浮點數格式。即 -9.625 的二進制為 1001.101,用規范的浮點數表達應為 1.001101×23。
2、其次,因為 -9.625 是負數,所以符號段為 1。而這里的指數為 3,所以指數段為 3+127=130,即二進制的 10000010。有效數字省略掉小數點左側的 1 之后為 001101,然后在右側用零補齊。因此所得的最終結果為:
?
3、最后,我們還可以將浮點數形式表示為十六進制的數據,如下所示:
即最終的十六進制結果為 0xC11A0000。
先將實數由十進制轉換為二進制數
例?5865.236
整數部分:5865? =BIN?1 0110 1110 1001
小數部分:.236? ?=BIN 00111100011010100111111
5865.236=1.0110 1110 1001 ,001111000110101
利用上述工程,使用科學計數法記錄
5865.236=1,0110 1110 1001111000110101x212
12+127=139? 二進制表示為10001011,
故指數部分表示為10001011
小數部分為科學計數法的后23位
即0110 1110 1001111000110101
5865.23=0? ?10001011? ? ??01101110100100111100011
? ? ? ?符號位? ? ? ? 指數位? ? ? ? ? ? ?小數位
?
?
?
總結
- 上一篇: (CVE-2014-0160)OpenS
- 下一篇: 智联招聘如何设置公司屏蔽