代码之家  ›  专栏  ›  技术社区  ›  dlamotte

在perl中,浮点表示法与十进制表示法之间如何可以相差1?

  •  1
  • dlamotte  · 技术社区  · 15 年前

    当函数输出1024 PB的“1024.0 P”时,我开始研究这个问题。起初我以为我无意中使用了<=vs<,但经过进一步检查,我发现发生了一些更有趣的事情。

    use strict;
    
    my $bytesize = 1024;
    my $final = 1152921504606846720;
    while (1) {
        printf "bytesize %%d: %d %%f: %s %s final %%d: %19d %%f: %26f\n",
            $bytesize,$bytesize,
            (
                $bytesize == $final ? '==' :
                $bytesize > $final  ? '>'  :
                $bytesize < $final  ? '<'  :
                '<error>'
            ),
            $final,$final;
        last if $final < $bytesize;
        $final /= $bytesize;
    }
    printf "final = bytesize d:%d f:%s %s final d:%d f:%f\n",
        $bytesize,$bytesize,
        (
            $bytesize == $final ? '==' :
            $bytesize > $final  ? '>'  :
            $bytesize < $final  ? '<'  :
            '<error>'
        ),
        $final,$final;
    

    我收到的输出是:

    bytesize %d: 1024 %f: 1024 < final %d: 1152921504606846720 %f: 1152921504606846720.000000
    bytesize %d: 1024 %f: 1024 < final %d:    1125899906842623 %f:    1125899906842623.750000
    bytesize %d: 1024 %f: 1024 < final %d:       1099511627775 %f:       1099511627775.999756
    bytesize %d: 1024 %f: 1024 < final %d:          1073741823 %f:          1073741824.000000
    bytesize %d: 1024 %f: 1024 < final %d:             1048575 %f:             1048576.000000
    bytesize %d: 1024 %f: 1024 > final %d:                1023 %f:                1024.000000
    final = bytesize d:1024 f:1024 > final d:1023 f:1024.000000
    

    这里需要注意的是,十进制中的最终值是1023,而浮点值是1024。这怎么可能呢?显然,perl使用的是十进制表示。

    2 回复  |  直到 12 年前
        1
  •  2
  •   PP.    15 年前

    Perl似乎正在舍入传递给的值 %f int($final) 你会得到 1023 输出,指示 %d

        2
  •  10
  •   DigitalRoss    15 年前

    原始值不是1024 PB,而是256 PB以下(我注意到了这一点,把它放进 dc(1)

    1023.999999999999772626324556767940

    这自然会截断到1023,并舍入到1024。