Microsoft Visual C++ 与 IEEE 数值标准一致。存在实数的三种内部变化。在 Visual C++ 中使用 Real*4 和 real*8。Real*4 用字 float 声明。Real*8 用字 double 声明。在 Windows 32 位编程中,long double 数据类型映射为 double。然而,对使用 real*10 数据类型的计算有汇编语言支持。
值如下存储:
值 | 存储为 |
---|---|
real*4 | 符号位、8 位指数、23 位尾数 |
real*8 | 符号位、11 位指数、52 位尾数 |
real*10 | 符号位、15 位指数、64 位尾数 |
在 real*4 和 real*8 格式中,尾数中有一个假定的前导 1,而它并没有存储在内存中,因此尾数实际上是 24 位或 53 位,即使只存储了 23 位或 52 位。real*10 格式实际存储此位。
指数偏离可能值的一半。这表示实际的指数是从存储指数中减去此偏差获得的。如果存储指数小于此偏差,则它实际上是负指数。
指数如下偏离:
指数 | 偏离量 |
---|---|
8 位 (real*4) | 127 |
11 位 (real*8) | 1023 |
15 位 (real*10) | 16383 |
这些指数不是 10 的幂;它们是 2 的幂。也就是说,8 位存储指数最多可以为 127。值 2**127 大约等于 10**38,这是 real*4 的实际限制。
尾数被存储为 1.XXX... 形式的二进制分数。. 此分数有一个大于或等于 1 且小于 2 的值。注意实数总是以规范化形式存储;即尾数左移以使尾数的高序位总是 1。因为该位总是 1,所以在 real*4 和 real*8 格式中采用(而不是存储)它。假定二进制(不是十进制)点刚好在前导 1 的右边。
因此,各种大小的格式如下:
格式 | 字节 1 | 字节 2 | 字节 3 | 字节 4 | ... | 字节 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
是指数位,M
是尾数位。注意最左边的位在 real*4 和 real*8 格式中被采用,但它在 real*10 格式的字节 3 中以 1 表示。
若要适当地变换二进制点,首先取消阶码,然后将二进制点向左或向右移动适当的位数。
下面是 real*4 格式的一些示例:
SXXX XXXX XMMM MMMM ... MMMM MMMM2 = 1 * 2**1 = 0100 0000 0000 0000 ... 0000 0000 = 4000 0000
-2 = -1 * 2**1 = 1100 0000 0000 0000 ... 0000 0000 = C000 0000
4 = 1 * 2**2 = 0100 0000 1000 0000 ... 0000 0000 = 4080 0000
6 = 1.5 * 2**2 = 0100 0000 1100 0000 ... 0000 0000 = 40C0 0000
1 = 1 * 2**0 = 0011 1111 1000 0000 ... 0000 0000 = 3F80 0000
.75 = 1.5 * 2**-1 = 0011 1111 0100 0000 ... 0000 0000 = 3F40 0000
2.5 = 1.25 * 2**1 = 0100 0000 0010 0000 ... 0000 0000 = 4020 0000
0.1 = 1.6 * 2**-4 = 0011 1101 1100 1100 ... 1100 1101 = 3DCC CCCD
0 = 1.0 * 2**-128 = all zeros--a special case.
联系客服