首页 文章

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

提问于
浏览
1

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

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

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

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

1 回答

  • 5

    是的,如果使用足够的数字,则每个有限的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)将为零 .

相关问题