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