Ruixiang Li

Floating Point

对于二进制小数,小数点之后的数位依然表示2的幂次。整个数的计算同二进制整数:$ \sum_{k=-j}^ib_k\times 2^k $

数字左移和右移对应到 乘 / 除以 2的操作,0.11111111...只比1小一点点,我们用1.0-epsilon表示(这由小数点后有多少位决定)。

Limitations

IEEE Floating Point

IEEE Standard 754(IEEE 754 标准)

IEEE 标准对浮点数的舍入、溢出、下溢进行了统一的规定:

挑战:硬件实现的复杂性

浮点数表示方法 (Floating Point Representation)

IEEE 754 浮点数标准定义了浮点数的 二进制表示形式,其核心是基于科学计数法的一种形式。下面我们具体解析该表示形式和编码细节:


1. 数值表示的结构

IEEE 754 针对浮点数定义了一个通用的数学表示形式:

$ (−1)^s⋅M⋅2^E $


2. 编码形式 (Encoding)

浮点数需要通过具体的位字段编码来存储在计算机的二进制内存中。IEEE 754 的编码方案是分为以下几个字段:

字段组成:

  1. S (Sign):最高位(Most Significant Bit, MSB, 即第一个比特),表示符号位 s。

    0 表示正号,1 表示负号。

  2. exp (Exponent Field,指数字段)

    用来编码指数 E,但指数的实际值 E 通常需要经过偏移(bias)调整: E=exp−Bias 其中,Bias 是根据字段长度设定的偏移量,用来支持正数和负数的指数值。

  3. frac (Fractional Field,尾数字段): 用来编码有效数字 M。但 M 并不是直接以完整的形态保存,而是存储尾数的 小数部分(省略规范化表示中的隐藏部分 1.)。

例如,M=1.1101​中只存储 1101(小数部分)。


3. 浮点数的完整二进制形式

浮点数的完整二进制形式分为符号、指数和尾数三个部分,具体结构如下:

IEEE 754 的表示方法可以高效地表示非常大的或非常小的数值,同时兼顾精度,成为现代计算机浮点运算的标准。

exp部分一般不会是全0或全1,在公式中使用exp时,还需要减去其对应的偏移量bias,计算公式为:$ bias = 2^{k-1}-1 $,其中k为指数位exp字段的位数。

数据类型 指数字段k 偏移量bias exp E
单精度 k=8 127 1~254 -126~127
双精度 k=11 1023 1~2046 -1022~1023

对于尾数位,只存储了浮点数的小数部分,也即分数字段,例如对于1.011,只存储其分数部分的011,故有效位为:1.xxxxx...xxx=1.0+frac

这种方法平衡了浮点数的数值范围和精度问题。

exp=000...0时,会认为是非标准化浮点数,此时E=1-bias而非0-bias,表示范围在01之间。

以及一些特殊值:

舍入(Rounding)

向偶数舍入是计算机和 IEEE 754 标准默认的舍入模式,其基本原则是:

这种方法有效的减少了累计误差,考虑到了长期计算下的数值稳定性。

二进制舍入(Binary Rounding) 下,有以下规律:

以上规律为形式化规律。

FP Multiplication

浮点数乘法包括三部分:

之后还需要对结果进行修正与调整:

FP Addition

  1. 指数对齐 将两个数的指数对齐,较小数的尾数右移,使指数相同;右移可能导致精度损失或直接舍入为 0。

  2. 尾数计算 根据符号,尾数相加或相减;相减时保留绝对值较大的数的符号,结果为 0 时直接返回。

  3. 尾数规范化 调整尾数使其满足标准化要求:尾数过大时右移并增加指数,尾数过小时左移并减少指数。

  4. 溢出和下溢处理 检查指数是否超出范围;溢出返回无穷大,下溢返回 0 或次正规数。

  5. 舍入 根据舍入规则处理尾数超过有效位数的多余部分,可能导致尾数溢出,触发重新规范化。

  6. 组装结果 根据最终符号、指数和规范化尾数,组装出浮点数结果,特殊值(如无穷大或 NaN)需特殊处理。