用十进制数表示的二进制浮点数
Binary Floats Represented as Decimal Numbers
并非所有十进制数都可以使用二进制浮点数准确表示。
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
There are two reasons why a real number might not be exactly
representable as a floating-point number. The most common situation is
illustrated by the decimal number 0.1. Although it has a finite
decimal representation, in binary it has an infinite repeating
representation.
反过来呢?如果使用了足够多的数字,每个 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("%.55f\n", 1.1);
}
结果:
1.1000000000000000888178419700125232338905334472656250000
上面表示的末尾显示的四个之后全为零。 1.100000000000000088817841970012523233890533447265625 是最接近 11/10 的双精度值。
正如下面的评论所指出的,负指数每增加一个量级单位也需要一个额外的小数位来准确表示。但是大量的负指数在它们的十进制表示中有前导零。最小的次正规数在点后有 1022 + 52 个十进制数字,但这些数字的前近 1022*log10(2) 将是零。
并非所有十进制数都可以使用二进制浮点数准确表示。
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
There are two reasons why a real number might not be exactly representable as a floating-point number. The most common situation is illustrated by the decimal number 0.1. Although it has a finite decimal representation, in binary it has an infinite repeating representation.
反过来呢?如果使用了足够多的数字,每个 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("%.55f\n", 1.1);
}
结果:
1.1000000000000000888178419700125232338905334472656250000
上面表示的末尾显示的四个之后全为零。 1.100000000000000088817841970012523233890533447265625 是最接近 11/10 的双精度值。
正如下面的评论所指出的,负指数每增加一个量级单位也需要一个额外的小数位来准确表示。但是大量的负指数在它们的十进制表示中有前导零。最小的次正规数在点后有 1022 + 52 个十进制数字,但这些数字的前近 1022*log10(2) 将是零。