Microsoft Visual C++ 與 IEEE 數(shù)值標(biāo)準(zhǔn)一致。存在實數(shù)的三種內(nèi)部變化。在 Visual C++ 中使用 Real*4 和 real*8。Real*4 用字 float 聲明。Real*8 用字 double 聲明。在 Windows 32 位編程中,long double 數(shù)據(jù)類型映射為 double。然而,對使用 real*10 數(shù)據(jù)類型的計算有匯編語言支持。
值如下存儲:
| 值 |
存儲為 |
| real*4 |
符號位、8 位指數(shù)、23 位尾數(shù) |
| real*8 |
符號位、11 位指數(shù)、52 位尾數(shù) |
| real*10 |
符號位、15 位指數(shù)、64 位尾數(shù) |
在 real*4 和 real*8 格式中,尾數(shù)中有一個假定的前導(dǎo) 1,而它并沒有存儲在內(nèi)存中,因此尾數(shù)實際上是 24 位或 53 位,即使只存儲了 23 位或 52 位。real*10 格式實際存儲此位。
指數(shù)偏離可能值的一半。這表示實際的指數(shù)是從存儲指數(shù)中減去此偏差獲得的。如果存儲指數(shù)小于此偏差,則它實際上是負指數(shù)。
指數(shù)如下偏離:
| 指數(shù) |
偏離量 |
| 8 位 (real*4) |
127 |
| 11 位 (real*8) |
1023 |
| 15 位 (real*10) |
16383 |
這些指數(shù)不是 10 的冪;它們是 2 的冪。也就是說,8 位存儲指數(shù)最多可以為 127。值 2**127 大約等于 10**38,這是 real*4 的實際限制。
尾數(shù)被存儲為 1.XXX... 形式的二進制分數(shù)。. 此分數(shù)有一個大于或等于 1 且小于 2 的值。注意實數(shù)總是以規(guī)范化形式存儲;即尾數(shù)左移以使尾數(shù)的高序位總是 1。因為該位總是 1,所以在 real*4 和 real*8 格式中采用(而不是存儲)它。假定二進制(不是十進制)點剛好在前導(dǎo) 1 的右邊。
因此,各種大小的格式如下:
| 格式 |
字節(jié) 1 |
字節(jié) 2 |
字節(jié) 3 |
字節(jié) 4 |
... |
字節(jié) n |
| real*4 |
SXXX XXXX |
XMMM MMMM |
MMMM MMMM |
MMMM MMMM |
|
|
| real*8 |
SXXX XXXX |
XXXX MMMM |
MMMM MMMM |
MMMM MMMM |
... |
MMMM MMMM |
| real*10 |
SXXX XXXX |
XXXX XXXX |
1MMM MMMM |
MMMM MMMM |
... |
MMMM MMMM |
S 表示符號位,X 是指數(shù)位,M 是尾數(shù)位。注意最左邊的位在 real*4 和 real*8 格式中被采用,但它在 real*10 格式的字節(jié) 3 中以 1 表示。
若要適當(dāng)?shù)刈儞Q二進制點,首先取消階碼,然后將二進制點向左或向右移動適當(dāng)?shù)奈粩?shù)。
示例
下面是 real*4 格式的一些示例:
- 在下面的示例中,符號位是零,存儲指數(shù)是 128,以二進制表示則為 100 0000 0,即 127 加 1。000 0000 ... 存儲尾數(shù)是 (1.)000 0000 ... 0000 0000,它有一個隱含的前導(dǎo) 1 和二進制點,因此實際的尾數(shù)是 1。
SXXX XXXX XMMM MMMM ... MMMM MMMM
2 = 1 * 2**1 = 0100 0000 0000 0000 ... 0000 0000 = 4000 0000
- 除了設(shè)置符號位外與 +2 相同。這適用于所有 IEEE 格式的浮點數(shù)。
-2 = -1 * 2**1 = 1100 0000 0000 0000 ... 0000 0000 = C000 0000
- 尾數(shù)相同,指數(shù)增加 1(偏差值是 129 或者二進制的 100 0000 1)。
4 = 1 * 2**2 = 0100 0000 1000 0000 ... 0000 0000 = 4080 0000
- 指數(shù)相同,尾數(shù)大一半 — 它是 (1.)100 0000 ...0000 0000,由于這是二進制分數(shù),即 1 1/2(分數(shù)位數(shù)的值是 1/2、1/4、1/8 等等)。
6 = 1.5 * 2**2 = 0100 0000 1100 0000 ... 0000 0000 = 40C0 0000
- 指數(shù)與其他 2 的冪相同,尾數(shù)是 127 或二進制的 011 1111 1 處小于 2 的 1。
1 = 1 * 2**0 = 0011 1111 1000 0000 ... 0000 0000 = 3F80 0000
- 階碼是 126(它是二進制中的 011 1111 0),尾數(shù)是 (1.)100 0000 ... 0000 0000,表示 1 1/2。
.75 = 1.5 * 2**-1 = 0011 1111 0100 0000 ... 0000 0000 = 3F40 0000
- 除了在尾數(shù)中設(shè)置表示 1/4 的位,完全與 2 相同。
2.5 = 1.25 * 2**1 = 0100 0000 0010 0000 ... 0000 0000 = 4020 0000
- 1/10 在二進制中是重復(fù)的分數(shù)。尾數(shù)害怕 1.6,而階碼假定 1.6 被 16 除(它是二進制中的 011 1101 1,十進制中是 123)。實際的指數(shù)是 123 – 127 = –4,表示乘法因數(shù)是 2**–4 = 1/16。請注意,存儲尾數(shù)在最后一位被舍入(嘗試盡可能精確地表示無法表示的數(shù))。(1/10 和 1/100 在二進制中表示不嚴格的原因類似于 1/3 在十進制中表示不嚴格的原因。)
0.1 = 1.6 * 2**-4 = 0011 1101 1100 1100 ... 1100 1101 = 3DCC CCCD
0 = 1.0 * 2**-128 = all zeros--a special case.