在 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
感谢大家的努力。
在 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
感谢大家的努力。