解压浮值时Perl奇怪的行为

时间:2013-09-23 22:07:14

标签: perl floating-point endianness

我有一个带有奇怪结果的片段(279.1 ...对比279.6 ......):

$ perl -e "print unpack('f>', pack ('f>', 279.117156982422));"
279.617156982422

虽然这个有效

$ perl -e "print unpack('f>', pack ('f>', 279.117256982422));"
279.117248535156

还有那些

$ perl -e "print unpack('f<', pack ('f<', 279.117156982422));"
279.11715698242

$ perl -e "print unpack('f', pack ('f', 279.117156982422));"
279.117156982422

怎么了?这是解压缩非本机端点浮点值的错误吗?

注意Perl是PC上Cygwin下的版本5.14.2。

2 个答案:

答案 0 :(得分:1)

绝对是Perl解包的错误。至少在32位平台xxxxyyFF中,它难以以二进制形式80 <= yy <= BF处理浮点数。打包结果将变为xxxxzzFF,其中zz = yy + 40(全部为十六进制)。这是一个字节序问题,正如你在这里看到的那样:

$ perl -e "print unpack('H8', pack ('f', unpack('f', pack('H8', '000088ff'))));"; 
0000c8ff

答案 1 :(得分:1)

这是海湾合作委员会的问题。

cpan -t Acme :: Study :: SREZIC在我的32位系统上传递OK,其中Perl二进制文件是用GCC 4.5.4或4.6.3或4.6.4编译的,并且不传递编译Perl二进制文件的系统与GCC 4.7.3或4.8.3