用十进制数表示的二进制浮点数



不是所有的十进制数都可以用二进制浮点数精确表示。

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

实数可能不是精确的有两个原因可表示为浮点数的。最常见的情况是用十进制数0.1表示。尽管它是有限的十进制表示,在二进制中它有一个无限的重复表示。

反过来呢?如果使用了足够多的数字,是否每个IEEE 754浮点数都可以精确地使用十进制数表示?

是的,如果使用了足够多的数字,则每个有限的IEEE 754浮点数都可以精确地用十进制数表示。

每增加一个精度的二进制数字,最多需要增加一个精度的十进制数字来精确表示。

例如:

0.1b   -> 0.5
0.01b  -> 0.25
0.11b  -> 0.75
0.001b -> 0.125

在1到2之间的双精度(binary64)数只需要在点后面精确表示52个十进制数字:

#include <stdio.h>
int main(void) {
  printf("%.55fn", 1.1);
}
结果:

1.1000000000000000888178419700125232338905334472656250000

在上面表示的末尾显示的4之后都是0。1.100000000000000088817841970012523233890533447265625是最接近11/10的双精度数的精确值。

在下面的注释中指出,一个负指数的每一个额外的幅度单位也需要一个额外的十进制数字来精确地表示。但是大的负指数在其十进制表示中有前导零。最小的次正规数在点后面有1022 + 52个十进制数字,但第一个接近1022*log10(2)的数字将是零。