Skip Menu |
Report information
Id: 128919
Status: resolved
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: zefram [at] fysh.org
Cc:
AdminCc:

Operating System: Linux
PatchStatus: (no value)
Severity: low
Type: core
Perl Version: 5.24.0
Fixed In: (no value)



Date: Sat, 13 Aug 2016 23:14:22 +0100
To: perlbug [...] perl.org
Subject: limited exponent range in hex fp literal with long double
From: zefram [...] fysh.org
CC: zefram [...] fysh.org
Download (untitled) / with headers
text/plain 4.1k
This is a bug report for perl from zefram@fysh.org, generated with the help of perlbug 1.40 running under perl 5.24.0. ----------------------------------------------------------------- [Please describe your issue here] With x86 80-bit long double: $ perl -MData::Float -lwe 'print 0x1p-1074' 4.94065645841246544e-324 $ perl -MData::Float -lwe 'print 0x1p-1075' 0 $ perl -MData::Float -lwe 'print 2**-1075' 2.47032822920623272e-324 $ perl -MData::Float -lwe 'print 2**-16445' 3.6451995318824746e-4951 Observe that a hex floating point literal with exponent below -1074 yields a zero value, though -1074 was OK. As indicated by the subsequent computations, much lower powers of two can actually be represented in this floating point format. Hex literals ought to accept much lower exponents accordingly. What's special about -1074 is that 2**-1074 is the smallest power of two representable in the native *double* format (not long double). A double-typed pow() call is being used where an NV-typed computation is required. [Please do not change anything below this line] ----------------------------------------------------------------- --- Flags: category=core severity=low --- Site configuration information for perl 5.24.0: Configured by zefram at Mon May 9 19:42:55 BST 2016. Summary of my perl5 (revision 5 version 24 subversion 0) configuration: Platform: osname=linux, osvers=3.16.0-4-amd64, archname=x86_64-linux-thread-multi-ld uname='linux barba.rous.org 3.16.0-4-amd64 #1 smp debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 gnulinux ' config_args='-des -Dprefix=/home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f63 -Duselargefiles -Dusethreads -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dusedevel -Uversiononly -Ui_db -Duselongdouble' hint=recommended, useposix=true, d_sigaction=define useithreads=define, usemultiplicity=define use64bitint=define, use64bitall=define, uselongdouble=define usemymalloc=n, bincompat5005=undef Compiler: cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2', optimize='-O2', cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include' ccversion='', gccversion='4.9.2', gccosandvers='' intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678, doublekind=3 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, longdblkind=3 ivtype='long', ivsize=8, nvtype='long double', nvsize=16, Off_t='off_t', lseeksize=8 alignbytes=16, prototype=define Linker and Libraries: ld='cc', ldflags =' -fstack-protector-strong -L/usr/local/lib' libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib libs=-lpthread -lnsl -ldb -ldl -lm -lcrypt -lutil -lc perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc libc=libc-2.19.so, so=so, useshrplib=true, libperl=libperl.so gnulibc_version='2.19' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f63/lib/5.24.0/x86_64-linux-thread-multi-ld/CORE' cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong' --- @INC for perl 5.24.0: /home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f63/lib/site_perl/5.24.0/x86_64-linux-thread-multi-ld /home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f63/lib/site_perl/5.24.0 /home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f63/lib/5.24.0/x86_64-linux-thread-multi-ld /home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f63/lib/5.24.0 . --- Environment for perl 5.24.0: HOME=/home/zefram LANG (unset) LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f63/bin:/home/zefram/usr/perl/util:/home/zefram/pub/x86_64-unknown-linux-gnu/bin:/home/zefram/pub/common/bin:/usr/bin:/bin:/usr/local/bin:/usr/games PERL_BADLANG (unset) SHELL=/usr/bin/zsh
To: <perl5-porters [...] perl.org>, <bugs-bitbucket [...] rt.perl.org>
Subject: Re: [perl #128919] limited exponent range in hex fp literal with long double
Date: Sun, 14 Aug 2016 09:21:31 +1000
From: <sisyphus1 [...] optusnet.com.au>
Download (untitled) / with headers
text/plain 794b
Show quoted text
-----Original Message----- From: Zefram (via RT) Sent: Sunday, August 14, 2016 8:14 AM To: bugs-bitbucket@rt.perl.org Subject: [perl #128919] limited exponent range in hex fp literal with long double
> With x86 80-bit long double: > > $ perl -MData::Float -lwe 'print 0x1p-1074' > 4.94065645841246544e-324 > $ perl -MData::Float -lwe 'print 0x1p-1075' > 0
With perl 5, version 24, subversion 0 (v5.24.0) built for MSWin32-x64-multi-thread-ld I see the same behaviour. However, with perl 5, version 24, subversion 0 (v5.24.0) built for MSWin32-x86-multi-thread-64int-ld there's no such problem: C:\>perl -lwe "print 0x1p-1074" 4.94065645841246544e-324 C:\>perl -lwe "print 0x1p-1075" 2.47032822920623272e-324 C:\>perl -lwe "print 0x1p-1076" 1.23516411460311636e-324 Cheers, Rob
Subject: Re: [perl #128919] limited exponent range in hex fp literal with long double
To: perl5-porters [...] perl.org
Date: Sun, 14 Aug 2016 00:55:40 +0100
From: Zefram <zefram [...] fysh.org>
Download (untitled) / with headers
text/plain 306b
sisyphus1@optusnet.com.au wrote: Show quoted text
>However, with perl 5, version 24, subversion 0 (v5.24.0) built for >MSWin32-x86-multi-thread-64int-ld there's no such problem:
Weird. Perhaps double on that platform is actually the 80-bit type? Please show us the perl -V for both of the builds you mentioned. -zefram
Subject: Re: [perl #128919] limited exponent range in hex fp literal with long double
To: "Zefram" <zefram [...] fysh.org>, <perl5-porters [...] perl.org>
From: <sisyphus1 [...] optusnet.com.au>
Date: Sun, 14 Aug 2016 13:19:11 +1000
Download (untitled) / with headers
text/plain 6.9k
Show quoted text
-----Original Message----- From: Zefram Sent: Sunday, August 14, 2016 9:55 AM To: perl5-porters@perl.org Subject: Re: [perl #128919] limited exponent range in hex fp literal with long double
> sisyphus1@optusnet.com.au wrote:
>> However, with perl 5, version 24, subversion 0 (v5.24.0) built for >> MSWin32-x86-multi-thread-64int-ld there's no such problem:
> > Weird. Perhaps double on that platform is actually the 80-bit type?
No. "Double" is the normal 64-bit type. Incidentally, the same behaviour goes back to 5.22.0 (which was the first stable release of Windows perl to support 'long double' NVs). I've a vague notion that there might be some relevant mingw-specific stuff being done wrt a mingw powl bug ... but I haven't been able to dig it up (and my memory is not of much use). Tony or Jarkko might have a better recollection of it (or at least a better idea of where to look for it).
> Please show us the perl -V for both of the builds you mentioned.
Both builds have the 80-bit extended precision 'long double' as the NV - though, as you'll notice, they report different 'nvsize' values. For the 64-bit build (which exhibits the problem): ################################################ Summary of my perl5 (revision 5 version 24 subversion 0) configuration: Platform: osname=MSWin32, osvers=6.1, archname=MSWin32-x64-multi-thread-ld uname='' config_args='undef' hint=recommended, useposix=true, d_sigaction=undef useithreads=define, usemultiplicity=define use64bitint=define, use64bitall=undef, uselongdouble=define usemymalloc=n, bincompat5005=undef Compiler: cc='gcc', ccflags ' -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -D__USE_MINGW_ANSI_STDIO -fwrapv -fno-strict-aliasing -mms-bitfields', optimize='-s -O2', cppflags='-DWIN32' ccversion='', gccversion='5.3.0', gccosandvers='' intsize=4, longsize=4, ptrsize=8, doublesize=8, byteorder=12345678, doublekind=3 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, longdblkind=3 ivtype='long long', ivsize=8, nvtype='long double', nvsize=16, Off_t='long long', lseeksize=8 alignbytes=8, prototype=define Linker and Libraries: ld='g++', ldflags ='-s -L"c:\_64\perl524_530_ld\lib\CORE" -L"C:\_64\gcc-mingw-530\mingw64\lib"' libpth=C:\_64\gcc-mingw-530\mingw64\lib C:\_64\gcc-mingw-530\mingw64\lib C:\_64\gcc-mingw-530\mingw64\x86_64-w64-mingw32\lib C:\_64\msys_530\1.0\local\lib C:\_64\gcc-mingw-530\mingw64\lib\gcc\x86_64-w64-mingw32\5.3.0 libs= -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 perllibs= -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 libc=, so=dll, useshrplib=true, libperl=libperl524.a gnulibc_version='' Dynamic Linking: dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' ' cccdlflags=' ', lddlflags='-mdll -s -L"c:\_64\perl524_530_ld\lib\CORE" -L"C:\_64\gcc-mingw-530\mingw64\lib"' Characteristics of this binary (from libperl): Compile-time options: HAS_TIMES HAVE_INTERP_INTERN MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE PERL_DONT_CREATE_GVSV PERL_HASH_FUNC_ONE_AT_A_TIME_HARD PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS PERL_MALLOC_WRAP PERL_PRESERVE_IVUV USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME USE_LONG_DOUBLE USE_PERLIO USE_PERL_ATOF Built under MSWin32 Compiled at May 9 2016 22:42:52 @INC: C:/_64/perl524_530_ld/site/lib C:/_64/perl524_530_ld/lib . ################################################ For the 32-bit build (which does not exhibit the problem): ################################################ Summary of my perl5 (revision 5 version 24 subversion 0) configuration: Platform: osname=MSWin32, osvers=6.1, archname=MSWin32-x86-multi-thread-64int-ld uname='' config_args='undef' hint=recommended, useposix=true, d_sigaction=undef useithreads=define, usemultiplicity=define use64bitint=define, use64bitall=undef, uselongdouble=define usemymalloc=n, bincompat5005=undef Compiler: cc='gcc', ccflags =' -s -O2 -DWIN32 -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -D__USE_MINGW_ANSI_STDIO -fwrapv -fno-strict-aliasing -mms-bitfields', optimize='-s -O2', cppflags='-DWIN32' ccversion='', gccversion='5.3.0', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=12345678, doublekind=3 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12, longdblkind=3 ivtype='long long', ivsize=8, nvtype='long double', nvsize=12, Off_t='long long', lseeksize=8 alignbytes=8, prototype=define Linker and Libraries: ld='g++', ldflags ='-s -L"c:\MinGW\perl524_64int_ld\lib\CORE" -L"C:\_32\gcc-mingw-530\mingw32\lib"' libpth=C:\_32\gcc-mingw-530\mingw32\lib C:\_32\gcc-mingw-530\mingw32\lib C:\_32\gcc-mingw-530\mingw32\i686-w64-mingw32\lib C:\_32\msys_530\1.0\local\lib C:\_32\gcc-mingw-530\mingw32\lib\gcc\i686-w64-mingw32\5.3.0 libs= -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 perllibs= -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 libc=, so=dll, useshrplib=true, libperl=libperl524.a gnulibc_version='' Dynamic Linking: dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' ' cccdlflags=' ', lddlflags='-mdll -s -L"c:\MinGW\perl524_64int_ld\lib\CORE" -L"C:\_32\gcc-mingw-530\mingw32\lib"' Characteristics of this binary (from libperl): Compile-time options: HAS_TIMES HAVE_INTERP_INTERN MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE PERL_DONT_CREATE_GVSV PERL_HASH_FUNC_ONE_AT_A_TIME_HARD PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS PERL_MALLOC_WRAP PERL_PRESERVE_IVUV USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME USE_LONG_DOUBLE USE_PERLIO USE_PERL_ATOF Built under MSWin32 Compiled at May 9 2016 22:40:49 @INC: C:/MinGW/perl524_64int_ld/site/lib C:/MinGW/perl524_64int_ld/lib . ################################################ Cheers, Rob
RT-Send-CC: perl5-porters [...] perl.org, jhi [...] iki.fi
Download (untitled) / with headers
text/plain 885b
I noticed that Jarkko committed the following to blead: Branch: blead Patch: a149d1180209525972d84fd1a62f488da83e568a Author: Jarkko Hietaniemi <jhi@iki.fi> Commit summary: [perl #128919] limited exponent range in hex fp literal with long double However, the following tests fail on quadmath builds: # Failed test 106 - at op/hexfp.t line 250 # got "4.94065645841246544176568792868221e-324" # expected "4.94065645841246544e-324" # Failed test 107 - [perl \#128919] at op/hexfp.t line 251 # got "2.47032822920623272088284396434111e-324" # expected "2.47032822920623272e-324" # Failed test 108 - at op/hexfp.t line 252 # got "1.23516411460311636044142198217055e-324" # expected "1.23516411460311636e-324" t/op/hexfp ..................................................... FAILED at test 106 I'll copy him, since he's already done work on this ticket.
RT-Send-CC: perl5-porters [...] perl.org
Marking resolved until proven otherwise.


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org