Perl尾数与其他双打不同
发布时间:2020-12-15 23:32:08 所属栏目:大数据 来源:网络整理
导读:我正试图在浮动中扫描:13.8518009935297. 第一个例程是我自己的,第二个是MacOSX libc strtod,第三个是GMP的mpf_get_d(),第四个是 perls numeric.c:Perl_my_atof2(). 我用这个片段打印尾数: union ieee_double { struct { uint32_t fracl; uint32_t frach:
|
我正试图在浮动中扫描:13.8518009935297.
第一个例程是我自己的,第二个是MacOSX libc strtod,第三个是GMP的mpf_get_d(),第四个是 perls numeric.c: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%xn",l0.s.frach,l0.s.fracl);
这四个函数的返回值是: my-func : 0xbb41f 0x4283d21b strtod : 0xbb41f 0x4283d21c GMP : 0xbb41f 0x4283d21b perl : 0xbb41f 0x4283d232 前三个函数之间的差异是四舍五入. 如果我再次将所有四个双打打印成一个字符串,我就得到了 我的问题: 附加: $r = rand(25);
$t = $p->tokenize_str("$r");
tokenize_str()是我从string到double的转换实现. 解决方法
以下是一些回答您问题的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相同的结果.不同之处在于您在附加中指出的错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
