Floating point IEEE 754中的四舍五入至最近值

Floating point IEEE 754中的四舍五入至最近值,floating-point,ieee-754,Floating Point,Ieee 754,在IEEE 754中,有一种将浮点值四舍五入的“四舍五入到最近”方法 但我不理解该定义中的一项: 如果两个最近的可表示值相等接近,则 选择其最低有效位零 什么是“选择最低有效位零”使用舍入到偶数规则的最佳方法是将写入的双精度数字舍入到单精度,例如在C99或Java编程语言中 单精度有23个显式二进制数字,因此数字0x1.000000p0、0x1.000002p0、0x1.000004p0…是单精度数字,但介于两者之间的数字不是 当一个值正好位于两个连续的单精度浮点数l和u之间时,l和u的二进制展

在IEEE 754中,有一种将浮点值四舍五入的“四舍五入到最近”方法

但我不理解该定义中的一项:

如果两个最近的可表示值相等接近,则 选择其最低有效位零


什么是“选择最低有效位零”

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

单精度有23个显式二进制数字,因此数字0x1.000000p0、0x1.000002p0、0x1.000004p0…是单精度数字,但介于两者之间的数字不是

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

双精度数字0x1.000001p0、0x1.000003p0、0x1.00005P0…正好位于两个单精度数字之间,需要根据“最低有效位零”规则进行舍入

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;
  }
}
#包括
#包括
int main(int c,char*v[]{
双d=0x1.000001p0;
对于(int i=0;i<10;i++){
printf(“双精度:%.6a\n”
“单精度:%.6a\n\n”,
d、 (d);
d+=0x0.000002p0;
}
}
结果显示了圆点后以0作为23d二进制数字舍入到单精度值的方式:

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 双精度:0x1.000001p+0 单精度:0x1.000000p+0 双精度:0x1.000003p+0 单精度:0x1.000004p+0 双精度:0x1.000005p+0 单精度:0x1.000004p+0 双精度:0x1.000007p+0 单精度:0x1.000008p+0 双精度:0x1.000009p+0 单精度:0x1.000008p+0 双精度:0x1.00000bp+0 单精度:0x1.00000cp+0 双精度:0x1.00000dp+0 单精度:0x1.00000cp+0 双精度:0x1.00000fp+0 单精度:0x1.000010p+0 双精度:0x1.000011p+0 单精度:0x1.000010p+0 双精度:0x1.000013p+0 单精度:0x1.000014p+0
看来我理解了这个问题。 单精度和双精度数字可以通过以下方式表示为32和64位序列:

b bbbbbbbb bbbbbbbbbbbbbbbbbbbbbbb

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

因此,一个数字的
最低有效位
对于单精度数字是尾数的23d位,对于双精度数字是尾数的52d位。这是数字中最右边的一位。如果该位为零,将选择该位

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


感谢大家的努力。

012345678
,在本例中,8是最低有效位。改变数字最少的位(或数字)。在
#8
中添加一个,您将只增加该数字。在
#0
中添加一个,您将增加
10000000
。现在存储位
0001 0010
,前面的只是一个示例。这是为你做的吗?那么,如果我们有两个neibour单精度浮点数,尾数是以二进制形式写的:1.00000000000000001和1.00000000000000010,那么第二个数将被选择,因为它在最后23d位置包含零?这就是我对它的理解是的。它也被称为“”。请将此答案标记为“已接受”。如果其他人有同样的问题,他们会更容易找到答案。