有关于浮点格式表示的帖子。本文的目的是简要介绍浮点格式。
以下描述解释了 IEEE 754 二进制浮点表示的术语和主要细节。讨论仅限于单精度和双精度格式。
通常,二进制实数将以以下格式表示,
I m I m-1 …I 2 I 1 I 0 .F 1 F 2 …F n F n-1
其中 I m和 F n将分别是整数和分数部分的 0 或 1。
有限数也可以由四个整数分量、符号 (s)、底数 (b)、有效数 (m) 和指数 (e) 表示。然后数字的数值被评估为
(-1) s xmxb e ________其中 m < |b|
根据用于编码各种组件的基数和位数,IEEE 754 标准定义了五种基本格式。五种格式中,binary32 和binary64 格式分别是基数为2 的单精度和双精度格式。
表 – 1 精度表示
Precision | Base | Sign | Exponent | Significand |
Single precision | 2 | 1 | 8 | 23+1 |
Double precision | 2 | 1 | 11 | 52+1 |
单精度格式:
如表 1 所述,单精度格式有 23 位有效位(1 代表隐含位,详情见下文)、8 位指数和 1 位符号。
例如,有理数 9÷2 可以转换为单精度浮点格式如下,
9 (10) ÷ 2 (10) = 4.5 (10) = 100.1 (2)
如果结果用前导 1 位表示,即 1.001 (2) x 2 2 ,则称其为归一化的。 (类似地,当数字 0.000000001101 (2) x 2 3标准化时,它显示为 1.101 (2) x 2 -6 )。省略左边这个隐含的 1 给了我们浮点数的尾数。归一化数比相应的非归一化数提供更高的准确度。隐含的最高有效位可用于表示更准确的有效数(23 + 1 = 24 位),这称为次正规表示。浮点数将以标准化形式表示。
次正规数属于非正规化数。次正规表示会略微减小指数范围并且无法标准化,因为这会导致指数不适合该字段。次正规数不太准确,即与正规化数相比,它们在分数字段中用于非零位的空间更小。事实上,准确度会随着次正规数的大小减小而下降。但是,次正规表示在填充接近零的浮点数间隙时很有用。
换句话说,上面的结果可以写成 (-1) 0 x 1.001 (2) x 2 2其产生的整数分量为 s = 0, b = 2, 有效数 (m) = 1.001, 尾数 = 001 和 e = 2.对应的单精度浮点数可以用二进制表示如下,
其中 exponent 字段应该是 2,但编码为 129 (127+2) 称为biased exponent 。指数字段是纯二进制格式,它也用编码表示负指数(如符号幅度、1 的补码、2 的补码等)。偏置指数用于表示负指数。在执行按位比较两个浮点数的相等性时,有偏指数比其他负表示具有优势。
将 (2 n-1 – 1)的偏差(其中 n是指数中使用的位数)添加到指数 (e) 以获得偏置指数 ( E )。因此,可以得到单精度数的偏置指数( E )为
E = e + 127
单精度格式的指数范围是-128 到+127。其他值用于特殊符号。
注意:当我们解包一个浮点数时,得到的指数是偏置指数。从有偏指数中减去 127 我们可以提取无偏指数。
双精度格式:
如表 – 1 中所述,双精度格式有 52 位有效位(1 代表隐含位)、11 位指数和 1 位符号。除了各种组件的大小之外,所有其他定义对于双精度格式都是相同的。
精确:
可以用浮点表示法表示的最小变化称为精度。单精度归一化数的小数部分恰好有 23 位分辨率(24 位带有隐含位)。这对应于 log (10) (2 23 ) = 6.924 = 7(对数的特征)精度的十进制数字。同样,在双精度数字的情况下,精度为 log (10) (2 52 ) = 15.654 = 16 个十进制数字。
准确性:
浮点表示的精度受有效位位数控制,而范围受指数限制。并非所有实数都可以精确地以浮点格式表示。对于任何不是浮点数的数,有两种浮点逼近选项,例如,最接近的小于 x的浮点数作为 x_ 和最接近的大于 x 的浮点数作为 x+。基于所选模式对尾数字段中的有效位数执行舍入运算。向下舍入模式导致 x 设置为 x_,向上舍入模式导致 x 设置为 x+,向零舍入模式导致 x 是 x_ 或 x+ 之间的任何一个。舍入到最近模式将 x 设置为 x_ 或 x+,以最接近 x 的为准。通常舍入到最近是最常用的模式。浮点表示与实际值的接近程度称为精度。
特殊位模式:
该标准定义了一些特殊的浮点位模式。零不能有最高有效的 1 位,因此不能被归一化。隐藏位表示需要一种特殊的技术来存储零。对于相同的数值零,我们将有两个不同的位模式 +0 和 -0。对于单精度浮点表示,这些模式在下面给出,
0 00000000 00000000000000000000000 = +0
1 00000000 00000000000000000000000 = -0
同样,标准表示 +INF 和 -INF 的两种不同位模式。下面给出相同的,
0 11111111 00000000000000000000000 = +INF
1 11111111 00000000000000000000000 = -INF
所有这些特殊数字以及其他特殊数字(如下)都是次正规数,通过在指数字段中使用特殊位模式来表示。这稍微减小了指数范围,但这是完全可以接受的,因为范围太大了。
尝试计算 0 x INF、0 ÷ INF 等表达式没有数学意义。该标准将此类表达式的结果称为非数字 (NaN)。任何带有 NaN 的后续表达式都会产生 NaN。 NaN 的表示在指数域中具有非零有效数和全 1。下面显示了单精度格式(x 是无关位),
x 11111111 1 m 0000000000000000000000
其中m可以是 0 或 1。这为我们提供了 NaN 的两种不同表示。
0 11111111 110000000000000000000000 ____________ 信号 NaN (SNaN)
0 11111111 100000000000000000000000 ____________安静的 NaN (QNaN)
通常 QNaN 和 SNaN 用于错误处理。 QNaN 在大多数操作中传播时不会引发任何异常。而 SNaN 在大多数操作使用时会引发无效异常。
上溢和下溢:
当算术运算的真实结果是有限的,但幅度大于可以使用给定精度存储的最大浮点数时,就会发生溢出。当算术运算的真实结果的量级(无穷小)小于可以存储的最小归一化浮点数时,就会发生下溢。计算中不能忽略上溢,而下溢可以有效地用零代替。
字节序:
IEEE 754 标准定义了二进制浮点格式。架构细节留给硬件制造商。二进制浮点数中各个字节的存储顺序因架构而异。