2013-09-23 33 views
6

我有这个片段与奇怪的结果解压奇怪的行为(279.1 ...对... 279.6):的Perl上的浮点值

$ 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。

+1

前两种情况是使用不同版本的Perl还是不同的操作系统运行? –

+0

第一种情况下'pack'的结果是什么(我的意思是,什么是字节码)? – raina77ow

+0

用5.14.2(在Win7x64上的Cygwin上)重现。好奇。您可能发现了一个错误。请注意,'print unpack('H8',pack('f>',279.117156982422))'获取位返回'438b8eff',这是根据[this site](http:// babbage。 cs.qc.cuny.edu/IEEE-754.old/Decimal.html) –

回答

1

这是一个GCC的问题。

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编译

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

我写了关于rt.perl的错误报告。 org:https://rt.perl.org/Ticket/Display.html?id = 120405 –