在 IEEE 754 中四舍五入到最近

Round to Nearest in IEEE 754

在 IEEE 754 中,有一种 "Round to Nearest" 舍入浮点值的方法。

但我不明白该定义中的一项:

If the two nearest representable values are equally near, the one with its least significant bit zero is chosen

什么是"least significant bit zero is chosen"

使用四舍五入规则的最佳方法是将以 hexadecimal 编写的双精度数字四舍五入为单精度数字,例如在 C99 或 Java 编程语言中.

单精度有 23 个显式二进制数字,因此数字 0x1.000000p0、0x1.000002p0、0x1.000004p0、... 是单精度数字,但中间的数字不是。

当一个值恰好在两个连续的单精度浮点数l和u之间时,l和u的二进制展开式在点号后的第23位不同1.bbbbbbbbbbbbbbbbbbbbbbbbb * 2exp。这是 l 和 u 连续的简单结果。

双精度数 0x1.000001p0, 0x1.000003p0, 0x1.000005p0, ... 恰好在两个单精度数之间,需要根据“最低有效位零”规则进行舍入。

示例 C99 程序:

#include <stdio.h>
#include <stdlib.h>

int main(int c, char *v[]) {
  double d = 0x1.000001p0;
  for (int i = 0; i < 10; i++) {
    printf("double-precision:%.6a\n"
           "single-precision:%.6a\n\n",
           d, (float) d);
    d += 0x0.000002p0;
  }
}

结果说明如何四舍五入到点后的 23d 二进制数字为 0 的单精度值:

double-precision:0x1.000001p+0
single-precision:0x1.000000p+0

double-precision:0x1.000003p+0
single-precision:0x1.000004p+0

double-precision:0x1.000005p+0
single-precision:0x1.000004p+0

double-precision:0x1.000007p+0
single-precision:0x1.000008p+0

double-precision:0x1.000009p+0
single-precision:0x1.000008p+0

double-precision:0x1.00000bp+0
single-precision:0x1.00000cp+0

double-precision:0x1.00000dp+0
single-precision:0x1.00000cp+0

double-precision:0x1.00000fp+0
single-precision:0x1.000010p+0

double-precision:0x1.000011p+0
single-precision:0x1.000010p+0

double-precision:0x1.000013p+0
single-precision:0x1.000014p+0

看来我理解了这个问题。 单精度数和双精度数可以用以下方式表示为 32 位和 64 位序列:

b bbbbbbbb bbbbbbbbbbbbbbbbbbbbbbb

b bbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

这里b是零或一。 第一组对应于数字的符号。 第二组对应于数字的指数,由 8(单精度)和 11(双精度)位组成。 第三组对应一个数的尾数,由23位(单精度)和52位(双精度)组成

因此,一个数的least significant bit对于单精度数是尾数的23d位,对于双精度数是尾数的52d位。这是数字的最右边的位。如果该位为零,它将被选中。

注: 偶数和奇数仅为整数值定义。 因此,如果舍入函数仅将数字舍入为整数值,则此规则退化为 round-to-even rule

感谢大家的努力。