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