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相同的结果.不同之处在于您在附加中指出的错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |