二进制浮点数表示为十进制数

mcu*_*mcu 1 floating-point binary numbers decimal ieee-754

并非所有十进制数都可以使用二进制浮点数精确表示.

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

有两个原因可能导致实数不能完全表示为浮点数.最常见的情况用十进制数0.1表示.虽然它具有有限的十进制表示,但在二进制中它具有无限重复表示.

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

Pas*_*uoq 5

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

精度的每个附加二进制数字最多需要一个额外的十进制数字精确表示.

例如:

0.1b   -> 0.5
0.01b  -> 0.25
0.11b  -> 0.75
0.001b -> 0.125
Run Code Online (Sandbox Code Playgroud)

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

#include <stdio.h>

int main(void) {
  printf("%.55f\n", 1.1);
}
Run Code Online (Sandbox Code Playgroud)

结果:

1.1000000000000000888178419700125232338905334472656250000
Run Code Online (Sandbox Code Playgroud)

在上面的表示结尾显示的四个之后,它全是零.1.100000000000000088817841970012523233890533447265625是最接近11/10的双精确值.

正如下面的评论中所指出的,负指数的每个附加单位也需要一个额外的十进制数字来准确表示.但是,大幅度的负指数在其十进制表示中具有前导零.最小的次正规数在点之后将有1022 + 52个十进制数字,但这些数字的第一个近1022*log 10(2)将为零.

  • @Jongware负指数的每个附加单位也需要一个额外的十进制数字来准确表示.我将数学作为练习留给读者1 /(2 ^ 24),但如果它非常接近24,我不会感到惊讶.除非你的意思是不计算前导零,那么你需要减去24*log10(2)或类似的东西. (2认同)