develooper Front page | perl.perl5.porters | Postings from October 2013

Re: [perl #120405] Wrong results for unpack "f"

Thread Previous | Thread Next
From:
H.Merijn Brand
Date:
October 29, 2013 20:01
Subject:
Re: [perl #120405] Wrong results for unpack "f"
Message ID:
20131029210058.60355cf0@pc09.procura.nl
On Tue, 29 Oct 2013 21:45:27 +1100, Tony Cook <tony@develop-help.com>
wrote:

> On Tue, Oct 29, 2013 at 10:06:30AM +0100, Lukas Mai wrote:
> > On 29.10.2013 10:00, slaven@rezic.de (via RT) wrote:
> > > # New Ticket Created by  slaven@rezic.de 
> > > # Please include the string:  [perl #120405]
> > > # in the subject line of all future correspondence about this issue. 
> > > # <URL: https://rt.perl.org/Ticket/Display.html?id=120405 >
> > > 
> > > 
> > > The problem is described in the StackOverflow article http://stackoverflow.com/questions/18969702/perl-strange-behaviour-on-unpack-of-floating-value
> > 
> > Short version (copied into this bug for easier access):
> > -----------------------------------------------------------------------
> > 
> > $ perl -e "print unpack('f>', pack ('f>', 279.117156982422));"
> > 279.617156982422
> 
> I don't reproduce this here on Debian stable:
> 
> tony@mars:.../git/bse$ ~/perl/5.18.0-thr/bin/perl -le "print unpack('f>', pack ('f>', 279.117156982422));"
> 279.117156982422
> tony@mars:.../git/bse$ perl -le "print unpack('f>', pack ('f>', 279.117156982422));"
> 279.117156982422
> 
> perl -V output might be useful.
> 
> > Definitely a bug in Perl's unpacking. It has difficulty in handling
> > floats in the binary form xxxxyyFF at least in a 32-bit platform, where
> > 80 <= yy <= BF. The packed result will become xxxxzzFF, where zz = yy +
> > 40 (all in hexadecimal). And this is not a problem of endianness, as you
> > could see here:
> > 
> > $ perl -e "print unpack('H8', pack ('f', unpack('f', pack('H8',
> > '000088ff'))));";
> > 0000c8ff
> 
> I'm pretty sure this isn't a bug, but the FPU converting a signalling
> NaN into a quiet NaN, which the Intel CPU manual implies it does.
> 
> ie. this might happen when the float from pack() is converted into
> double or long double, whichever representation perl uses for an NV.
> 
> That said, the compiler might be depending on aliasing rules and
> loading afloat into an FPU register early, changing that code to use a
> union as was done in 275663fa07 for NVs might fix the problem.
> 
> Tony

Linux 3.7.10-1.16-desktop [openSUSE 12.3 (Dartmouth)]  i386 Core(TM) i7-2620M CPU @ 2.70GHz/2701(4) i686  8042 Mb

=== base/perl5.00307    5.00307  i686-linux
279.117156982422
=== base/perl5.00405    5.00405  i686-linux
Invalid type in pack: '>' at -e line 1.
Exit status: 512
=== base/perl5.00503    5.00503  i686-linux
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/perl5.00504    5.00504  i686-linux
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/perl5.6.0      5.006    i686-linux-64int
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/perl5.6.1      5.006001 i686-linux-64int-perlio
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/tperl5.6.1     5.006001 i686-linux-thread-multi-64int-ld-perlio
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/perl5.6.2      5.006002 i686-linux-64int-perlio
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/tperl5.6.2     5.006002 i686-linux-thread-multi-64int-ld-perlio
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/perl5.8.0      5.008    i686-linux-64int
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/tperl5.8.0     5.008    i686-linux-thread-multi-64int-ld
Invalid type in pack: '>' at -e line 1.
Exit status: 65280
=== base/perl5.8.1      5.008001 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.1     5.008001 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.8.2      5.008002 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.2     5.008002 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.8.3      5.008003 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.3     5.008003 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.8.4      5.008004 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.4     5.008004 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.8.5      5.008005 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.5     5.008005 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.8.6      5.008006 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.6     5.008006 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.8.7      5.008007 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.7     5.008007 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.8.8      5.008008 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.8     5.008008 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.8.9      5.008009 i686-linux-64int
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/tperl5.8.9     5.008009 i686-linux-thread-multi-64int-ld
Invalid type '>' in pack at -e line 1.
Exit status: 65280
=== base/perl5.10.0     5.010000 i686-linux-64int
279.117156982422
=== base/tperl5.10.0    5.010000 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.10.1     5.010001 i686-linux-64int
279.117156982422
=== base/tperl5.10.1    5.010001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.11.0     5.011000 i686-linux-64int
279.117156982422
=== base/tperl5.11.0    5.011000 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.11.1     5.011001 i686-linux-64int
279.117156982422
=== base/tperl5.11.1    5.011001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.11.2     5.011002 i686-linux-64int
279.117156982422
=== base/tperl5.11.2    5.011002 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.11.3     5.011003 i686-linux-64int
279.117156982422
=== base/tperl5.11.3    5.011003 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.11.4     5.011004 i686-linux-64int
279.117156982422
=== base/tperl5.11.4    5.011004 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.11.5     5.011005 i686-linux-64int
279.117156982422
=== base/tperl5.11.5    5.011005 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.12.0     5.012000 i686-linux-64int
279.117156982422
=== base/tperl5.12.0    5.012000 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.12.1     5.012001 i686-linux-64int
279.117156982422
=== base/tperl5.12.1    5.012001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.12.2     5.012002 i686-linux-64int
279.117156982422
=== base/tperl5.12.2    5.012002 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.12.3     5.012003 i686-linux-64int
279.117156982422
=== base/tperl5.12.3    5.012003 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.12.4     5.012004 i686-linux-64int
279.117156982422
=== base/tperl5.12.4    5.012004 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.12.5     5.012005 i686-linux-64int
279.617156982422
=== base/tperl5.12.5    5.012005 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/perl5.13.0     5.013000 i686-linux-64int
279.117156982422
=== base/tperl5.13.0    5.013000 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.1     5.013001 i686-linux-64int
279.117156982422
=== base/tperl5.13.1    5.013001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.2     5.013002 i686-linux-64int
279.117156982422
=== base/tperl5.13.2    5.013002 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.3     5.013003 i686-linux-64int
279.117156982422
=== base/tperl5.13.3    5.013003 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.4     5.013004 i686-linux-64int
279.117156982422
=== base/tperl5.13.4    5.013004 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.5     5.013005 i686-linux-64int
279.117156982422
=== base/tperl5.13.5    5.013005 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.6     5.013006 i686-linux-64int
279.117156982422
=== base/tperl5.13.6    5.013006 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.7     5.013007 i686-linux-64int
279.117156982422
=== base/tperl5.13.7    5.013007 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.8     5.013008 i686-linux-64int
279.117156982422
=== base/tperl5.13.8    5.013008 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.9     5.013009 i686-linux-64int
279.117156982422
=== base/tperl5.13.9    5.013009 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.10    5.013010 i686-linux-64int
279.117156982422
=== base/tperl5.13.10   5.013010 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.13.11    5.013011 i686-linux-64int
279.117156982422
=== base/tperl5.13.11   5.013011 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.14.0     5.014000 i686-linux-64int
279.117156982422
=== base/tperl5.14.0    5.014000 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.14.1     5.014001 i686-linux-64int
279.117156982422
=== base/tperl5.14.1    5.014001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.14.2     5.014002 i686-linux-64int
279.117156982422
=== base/tperl5.14.2    5.014002 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.14.3     5.014003 i686-linux-64int
279.617156982422
=== base/tperl5.14.3    5.014003 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.14.4    5.014004 i686-linux-64int-ld
279.617156982421875
=== base/perl5.14.4     5.014004 i686-linux-64int
279.617156982422
=== base/tperl5.14.4    5.014004 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/perl5.15.0     5.015000 i686-linux-64int
279.117156982422
=== base/tperl5.15.0    5.015000 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.1     5.015001 i686-linux-64int
279.117156982422
=== base/tperl5.15.1    5.015001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.2     5.015002 i686-linux-64int
279.117156982422
=== base/tperl5.15.2    5.015002 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.3     5.015003 i686-linux-64int
279.117156982422
=== base/tperl5.15.3    5.015003 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.4     5.015004 i686-linux-64int
279.117156982422
=== base/tperl5.15.4    5.015004 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.5     5.015005 i686-linux-64int
279.117156982422
=== base/tperl5.15.5    5.015005 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.6     5.015006 i686-linux-64int
279.117156982422
=== base/tperl5.15.6    5.015006 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.7     5.015007 i686-linux-64int
279.117156982422
=== base/tperl5.15.7    5.015007 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.8     5.015008 i686-linux-64int
279.117156982422
=== base/tperl5.15.8    5.015008 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.15.9     5.015009 i686-linux-64int
279.117156982422
=== base/tperl5.15.9    5.015009 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.16.0     5.016000 i686-linux-64int
279.117156982422
=== base/tperl5.16.0    5.016000 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.16.1     5.016001 i686-linux-64int
279.117156982422
=== base/tperl5.16.1    5.016001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.16.2     5.016002 i686-linux-64int
279.617156982422
=== base/tperl5.16.2    5.016002 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.16.3    5.016003 i686-linux-64int-ld
279.617156982421875
=== base/perl5.16.3     5.016003 i686-linux-64int
279.617156982422
=== base/tperl5.16.3    5.016003 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/perl5.17.0     5.017000 i686-linux-64int
279.117156982422
=== base/tperl5.17.0    5.017000 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.17.1     5.017001 i686-linux-64int
279.117156982422
=== base/tperl5.17.1    5.017001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.17.2     5.017002 i686-linux-64int
279.117156982422
=== base/tperl5.17.2    5.017002 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.17.3     5.017003 i686-linux-64int
279.117156982422
=== base/tperl5.17.3    5.017003 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.17.4     5.017004 i686-linux-64int
279.117156982422
=== base/tperl5.17.4    5.017004 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/perl5.17.5     5.017005 i686-linux-64int
279.617156982422
=== base/tperl5.17.5    5.017005 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.17.6    5.017006 i686-linux-64int-ld
279.617156982421875
=== base/perl5.17.6     5.017006 i686-linux-64int
279.617156982422
=== base/tperl5.17.6    5.017006 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.17.7    5.017007 i686-linux-64int-ld
279.617156982421875
=== base/perl5.17.7     5.017007 i686-linux-64int
279.617156982422
=== base/tperl5.17.7    5.017007 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.17.8    5.017008 i686-linux-64int-ld
279.617156982421875
=== base/perl5.17.8     5.017008 i686-linux-64int
279.617156982422
=== base/tperl5.17.8    5.017008 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/perl5.17.9     5.017009 i686-linux-64int
279.617156982422
=== base/tperl5.17.9    5.017009 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.17.10   5.017010 i686-linux-64int-ld
279.617156982421875
=== base/perl5.17.10    5.017010 i686-linux-64int
279.617156982422
=== base/tperl5.17.10   5.017010 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.17.11   5.017011 i686-linux-64int-ld
279.617156982421875
=== base/perl5.17.11    5.017011 i686-linux-64int
279.617156982422
=== base/tperl5.17.11   5.017011 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.18.0    5.018000 i686-linux-64int-ld
279.617156982421875
=== base/perl5.18.0     5.018000 i686-linux-64int
279.617156982422
=== base/tperl5.18.0    5.018000 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.18.1    5.018001 i686-linux-64int-ld
279.617156982421875
=== base/perl5.18.1     5.018001 i686-linux-64int
279.617156982422
=== base/tperl5.18.1    5.018001 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.19.0    5.019000 i686-linux-64int-ld
279.617156982421875
=== base/perl5.19.0     5.019000 i686-linux-64int
279.617156982422
=== base/tperl5.19.0    5.019000 i686-linux-thread-multi-64int-ld
279.617156982421875
=== base/cperl5.19.1    5.019001 i686-linux-64int-ld
279.117156982421875
=== base/perl5.19.1     5.019001 i686-linux-64int
279.117156982422
=== base/tperl5.19.1    5.019001 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/cperl5.19.2    5.019002 i686-linux-64int-ld
279.117156982421875
=== base/perl5.19.2     5.019002 i686-linux-64int
279.117156982422
=== base/tperl5.19.2    5.019002 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/cperl5.19.3    5.019003 i686-linux-64int-ld
279.117156982421875
=== base/perl5.19.3     5.019003 i686-linux-64int
279.117156982422
=== base/tperl5.19.3    5.019003 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/cperl5.19.4    5.019004 i686-linux-64int-ld
279.117156982421875
=== base/perl5.19.4     5.019004 i686-linux-64int
279.117156982422
=== base/tperl5.19.4    5.019004 i686-linux-thread-multi-64int-ld
279.117156982421875
=== base/cperl5.19.5    5.019005 i686-linux-64int-ld
279.117156982421875
=== base/perl5.19.5     5.019005 i686-linux-64int
279.117156982422
=== base/tperl5.19.5    5.019005 i686-linux-thread-multi-64int-ld
279.117156982421875
=== /usr/bin/perl       5.016002 i586-linux-thread-multi
279.617156982422
=== /pro/bin/perl       5.018000 i686-linux-64int-ld
279.617156982421875


-- 
H.Merijn Brand  http://tux.nl   Perl Monger  http://amsterdam.pm.org/
using perl5.00307 .. 5.19   porting perl5 on HP-UX, AIX, and openSUSE
http://mirrors.develooper.com/hpux/        http://www.test-smoke.org/
http://qa.perl.org   http://www.goldmark.org/jeff/stupid-disclaimers/

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About