IEEE浮点数标准将数表示成形式:
- 符号数
:决定了数是负的(
)还是正的(
),其中把数值
的符号位解释当做是一种特殊情形。
- 有效数
:一个二进制分数,范围要么是在
和
之间,要么是在
到
之间。
- 指数
:用
的幂次方对数值加权。
浮点数的位表示分成3个字段对符号数、有效数
、指数
进行编码:
-
位的符号字段
s
对符号数进行编码。
-
位的指数字段
对指数
进行编码;
-
位的分数字段
对有效数
进行编码,但是编码后的
值取决于指数字段
exp
是否等于。
图2.32展示了如何将这3个字段打包成两种最常见格式的字。
标准的浮点数格式.png
- 在单精度浮点数格式(C语言中的
float
)里,字长为位:
位表示符号字段
s
,位表示指数字段
exp
,位表示分数字段
frac
。 - 在双精度浮点数格式(C语言中的
double
)里,字长为位:
位表示符号字段
s
,位表示指数字段
exp
,位表示分数字段
frac
。
对于单精度浮点数,根据指数字段exp
的值,一个给定二进制表示的数值可分成3种不同的情况:
情形1:可归一化数
特征
指数字段
exp
既不全是0,也不全是1;
指数值;
;
解释:
- 单精度情形下,指数字段
exp
的无符号数范围是1到254,双精度情形下,指数字段exp
的无符号数范围是1到2046; - 解释指数
为一个用偏移形式表示的有符号数,即指数值
,其中
exp
是位模式为的无符号数,
(单精度情形数值为
,双精度情形数值为
)。据此可得出:单精度情形下指数值
的数值范围是
到
,双精度情形下指数值
的数值范围是
到
。
- 解释有效数
为一个二进制表示为
的数,等价于有效数
,这叫做隐式1开头表示。这样能多表示1位精度,因为通常会调整指数
使得有效数
满足
,且开头的位一直等于1,不需要显式地表示。用字段
frac
来表示分数值,其中
,对应的二进制表示为
。
情形2:不可归一化数
特征:
指数字段
exp
全是
指数值;
有效数;
解释:
- 有效数
,表示分数字段
frac
没有隐式的开头1;
为什么要提供不可归一化数?
- 不可归一化数提供了一种表示
的方法
由于可归一化数对应的有效数,所以不能用可归一化数来表示
。
- 为了表示非常接近
的数。
不可归一化数可提供熟知的渐近下溢性质:所有可能的数值在附近呈均匀分布。
如何表示?
- 符号位
s
是0,即符号数;
- 指数字段
exp
全是0,即指数;
- 分数字段
frac
全是0,即有效数;
-
;
如何表示?
- 符号位
s
是1,即符号数;
- 指数字段
exp
全是0,即指数;
- 分数字段
frac
全是0,即有效数;
-
;
注意:
- 使用IEEE浮点数标准,数值
和
在有些情形里当做是一样的,有些情形里当做是不一样的。
情形3:特殊值
特征:
指数字段
exp
全是1;
如何表示?
- 指数字段
exp
全是1; - 分数字段
frac
全是0; - 符号位
s
是0,即符号数;
如何表示?
- 指数字段
exp
全是1; - 分数字段
frac
全是0; - 符号位
s
是1,即符号数;
如何表示?
- 指数字段
exp
全是1; - 分数字段
frac
不等于;
两个惯用法:
- 当乘以两个非常大数,或者除以0时,使用无穷大来表示运算结果;
- 当运算结果不能用实数或者无穷大来表示时,就使用
来表示;