The problem is that in going between the actual longlong PDL object
data (which is correctly 64bit integers) and the conversion or display
there is a hidden translation through a double precision value which
only supports 52bits of integer precision.

This shows translation through double precision in longlong constructor:

   pdl> p longlong(10555000100001145) -  longlong(10555000100001144)
   0

A work around the limitation showing the longlong works once created:

   pdl> p longlong(1055500010000114)*10 + 5  - longlong(1055500010000114)*10 - 4
  1

Also confusing because the printing of the values seems to go through
double precision as well:

   pdl> p longlong(1055500010000114)*10 + 5
   10555000100001144

   pdl> p longlong(1055500010000114)*10 + 4
   10555000100001144

We'll open a bug ticket to track this issue.  It will be more important to
resolve now that PDL will be supporting 64bit indexing operations.

--Chris


On Wed, Oct 9, 2013 at 8:39 PM, Andrew Benson
<[email protected]> wrote:
> I've found some cases where longlong integer types are output incorrectly (off
> by one). Here's an example:
>
> #!/usr/bin/env perl
> use strict;
> use warnings;
> use PDL;
>
> my $a = pdl longlong(10555000100001144);
> my $b = pdl longlong(10555000100001145);
> my $ar = $a->get_dataref();
> my $br = $b->get_dataref();
> print $a." ".$b."\n";
> print ${$ar}."\n";
> print ${$br}."\n";
>
> ${$br} = "y".substr(${$br},1);
> $b->upd_data();
> print $a." ".$b."\n";
> print ${$ar}."\n";
> print ${$br}."\n";
> print unpack("q",${$ar})." ".unpack("q",${$br})."\n";
>
> exit;
>
>
> I first try to create to PDLs with longlong type and differing by 1. If I 
> write
> out the values they're identical, the first print statement reporting:
>
> 10555000100001144 10555000100001144
>
> I can check that these two are actually internally identical by outputting the
> packed Perl string representation (second pair of print statements):
>
> x��w�%
> x��w�%
>
> So, suppose I force the internal representations to be correct, by adjusting
> the packed string representation of $b. Then I write out the same information:
>
> 10555000100001144 10555000100001144
> x��w�%
> y��w�%
>
> So, now the internal representations differ as they should. But when I write
> out the values they still look identical.
>
> If I use unpack() to directly convert these strings to longlongs then I get
> the expected result:
>
> 10555000100001144 10555000100001145
>
> So, this seems to be a bug in displaying the longlong type.
>
> Note that if I use 10555000100001146 instead of 10555000100001145 it works as
> expected.
>
> Here's the output from "pdl -V"
>
> $ pdl -V
> perlDL shell v1.354_001
>  PDL comes with ABSOLUTELY NO WARRANTY. For details, see the file
>  'COPYING' in the PDL distribution. This is free software and you
>  are welcome to redistribute it under certain conditions, see
>  the same file for details.
>
> Summary of my PDL configuration
>
> VERSION: PDL v2.4.11 (supports bad values)
>
> $%PDL::Config = {
>                   'BADVAL_PER_PDL' => '0',
>                   'WITH_PROJ' => '0',
>                   'PDL_CONFIG_VERSION' => '0.005',
>                   'POSIX_THREADS_INC' => undef,
>                   'FFTW_TYPE' => 'double',
>                   'PDL_BUILD_DIR' => '/home/abenson/.cpan/build/PDL-2.4.11-
> VeX7gG',
>                   'FFTW_LIBS' => undef,
>                   'WITH_FFTW' => '0',
>                   'GSL_LIBS' => undef,
>                   'WITH_IO_BROWSER' => '0',
>                   'PROJ_INC' => undef,
>                   'WHERE_PLPLOT_INCLUDE' => undef,
>                   'HTML_DOCS' => '1',
>                   'SKIP_KNOWN_PROBLEMS' => '0',
>                   'WHERE_PLPLOT_LIBS' => undef,
>                   'WITH_3D' => '0',
>                   'WITH_POSIX_THREADS' => '1',
>                   'POGL_VERSION' => '0.65',
>                   'FFTW_INC' => undef,
>                   'HIDE_TRYLINK' => '1',
>                   'HDF_INC' => undef,
>                   'WITH_HDF' => '0',
>                   'POGL_WINDOW_TYPE' => 'glut',
>                   'WITH_GD' => '0',
>                   'WITH_BADVAL' => '1',
>                   'FITS_LEGACY' => '1',
>                   'WITH_SLATEC' => '1',
>                   'BADVAL_USENAN' => '0',
>                   'WITH_DEVEL_REPL' => '1',
>                   'TEMPDIR' => '/tmp',
>                   'PROJ_LIBS' => undef,
>                   'USE_POGL' => '0',
>                   'PDL_BUILD_VERSION' => '2.4.11',
>                   'GD_LIBS' => undef,
>                   'GSL_INC' => undef,
>                   'GD_INC' => undef,
>                   'WITH_GSL' => '0',
>                   'OPTIMIZE' => undef,
>                   'PDLDOC_IGNORE_AUTOLOADER' => '0',
>                   'HDF_LIBS' => undef,
>                   'POSIX_THREADS_LIBS' => undef,
>                   'MALLOCDBG' => {},
>                   'WITH_MINUIT' => '1',
>                   'WITH_PLPLOT' => '0',
>                   'MINUIT_LIB' => undef
>                 };
> Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
>   Platform:
>     osname=linux, osvers=2.6.18-53.el5, archname=x86_64-linux-thread-multi
>     uname='linux builder10.centos.org 2.6.18-53.el5 #1 smp mon nov 12 02:14:55
> est 2007 x86_64 x86_64 x86_64 gnulinux '
>     config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -
> fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -
> Dversion=5.8.8 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -
> Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -
> Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Dprivlib=/usr/lib/perl5/5.8.8 -
> Dsitelib=/usr/lib/perl5/site_perl/5.8.8 -
> Dvendorlib=/usr/lib/perl5/vendor_perl/5.8.8 -
> Darchlib=/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi -
> Dsitearch=/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi -
> Dvendorarch=/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi -
> Darchname=x86_64-linux-thread-multi -Dvendorprefix=/usr -Dsiteprefix=/usr -
> Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -
> Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -
> Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -
> Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -
> Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -
> Ud_endservent_r_proto -Ud_setservent_r_proto -Dinc_version_list=5.8.7 5.8.6
> 5.8.5 -Dscriptdir=/usr/bin'
>     hint=recommended, useposix=true, d_sigaction=define
>     usethreads=define use5005threads=undef useithreads=define
> usemultiplicity=define
>     useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
>     use64bitint=define use64bitall=define uselongdouble=undef
>     usemymalloc=n, bincompat5005=undef
>   Compiler:
>     cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe 
> -
> Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -
> D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
>     optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-
> protector --param=ssp-buffer-size=4 -m64 -mtune=generic',
>     cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -
> Wdeclaration-after-statement -I/usr/local/include -I/usr/include/gdbm'
>     ccversion='', gccversion='4.1.2 20080704 (Red Hat 4.1.2-48)',
> gccosandvers=''
>     intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
>     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
>     ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
> lseeksize=8
>     alignbytes=8, prototype=define
>   Linker and Libraries:
>     ld='gcc', ldflags =''
>     libpth=/usr/local/lib64 /lib64 /usr/lib64
>     libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
>     perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
>     libc=, so=so, useshrplib=true, libperl=libperl.so
>     gnulibc_version='2.5'
>   Dynamic Linking:
>     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-
> rpath,/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE'
>     cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall -Wp,-
> D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -
> m64 -mtune=generic'
>
> -Andrew
>
>
> --
>
> * Andrew Benson: http://users.obs.carnegiescience.edu/abenson/contact.html
>
> * Galacticus: http://sites.google.com/site/galacticusmodel
>
>
> _______________________________________________
> Perldl mailing list
> [email protected]
> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to