Perl尾数不同于其他双精度

Perl尾数不同于其他双精度,perl,double,numeric,mantissa,Perl,Double,Numeric,Mantissa,我正在尝试用浮点扫描:13.8518009935297。 第一个例程是我自己的,第二个是MacOSX libc的 斯特罗德,第三个是GMP的强制性公积金第四个是 perls numeric:Perl_my_atof2() 我使用此片段打印尾数: union ieee_double { struct { uint32_t fracl; uint32_t frach:20; u

我正在尝试用浮点扫描:13.8518009935297。 第一个例程是我自己的,第二个是MacOSX libc的 斯特罗德,第三个是GMP的强制性公积金第四个是 perls numeric:Perl_my_atof2()

我使用此片段打印尾数:

union ieee_double {
        struct {
                uint32_t    fracl;
                uint32_t    frach:20;
                uint32_t    exp:11;
                uint32_t    sign:1;
        } s;
        double d;
        uint64_t l;
};

 union ieee_double l0;
 l0.d = .... 
 printf("... 0x%x 0x%x\n", l0.s.frach, l0.s.fracl);
四个函数的返回值为:

my-func : 0xbb41f 0x4283d21b 
 strtod : 0xbb41f 0x4283d21c  
GMP     : 0xbb41f 0x4283d21b
perl    : 0xbb41f 0x4283d232
前三个函数之间的区别是四舍五入。 然而,perl的尾数非常不同步

如果我再次将所有四个双精度打印到一个字符串,我将得到 相同的十进制双回退,数字似乎相等

我的问题: 我的func、strtod和GMP之间的差异是四舍五入。然而, 为什么perl的尾数如此不同步,但如果 将其转换回十进制后,其结果又是相同的数字。 差是22,所以应该用小数点表示 分数。我怎么解释呢

追加: 对不起,我想我解决了问题:

  $r = rand(25);
  $t = $p->tokenize_str("$r");
tokenize_str()是我实现的从字符串到双精度的转换。 然而,perl stringify“$r”将$r打印为13.8518009935297,这是一个 已经截断了。 $r的实际值是不同的,所以当我在结尾时
$t和$r我得到了不同的值。

下面是一些perl代码来回答您的问题:

perl -le '($frac1, $frach)=unpack("II", pack "d", .0+"13.8518009935297");
print sprintf("%d %d 0x%03x 0x%04x", ($frach >> 31)&1, ($frach>>20)&0x5ff, $frach & 0xfffff, $frac1)'
->0 1026 0xbb41f 0x4283d21c

Perl给出了与strtod相同的结果。不同之处在于您在append中指出的错误。

根据,尾数的小数精度实际上比您显示的多2位:
13.851800993529700
。Perl版本等于
13.851800993529740
。因此,在您的精度级别上,差异并不显著。尽管如此,Perl为什么不同还是一个有趣的问题。无论如何,谢谢你的回答。。。