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
