Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"-0" inconsistent about signedness #13296

Open
p5pRT opened this issue Sep 21, 2013 · 1 comment
Open

"-0" inconsistent about signedness #13296

p5pRT opened this issue Sep 21, 2013 · 1 comment

Comments

@p5pRT
Copy link

p5pRT commented Sep 21, 2013

Migrated from rt.perl.org#119935 (status was 'new')

Searchable as RT119935$

@p5pRT
Copy link
Author

p5pRT commented Sep 21, 2013

From zefram@fysh.org

Created by zefram@fysh.org

Since Perl 5.17.1, the string "-0" appears to be a negative zero if it is
examined directly as a number, but negating it produces an unsigned zero​:

$ perl -lwe 'printf "%+.f%+.f\n", "-0", - - "-0"'
-0+0

This is unlike the pure floating-point value -0.0, which is consistently
signed​:

$ perl -lwe 'printf "%+.f%+.f\n", -0.0, - - -0.0'
-0-0

Also unlike the pure integer -0, which is consistently unsigned​:

$ perl -lwe 'printf "%+.f%+.f\n", -0, - - -0'
+0+0

"-0" is presumably meant to behave numerically like one or other of the
pure numbers. Up to and including 5.17.0 it was consistently signed.

In fact, it's worse​: whether a "-0" string appears signed or not
depends on which kind of numeric operation was performed on it first.
If it's passed to printf first then that string is a signed zero in all
subsequent operations. If it's negated first then that string is an
unsigned zero in all subsequent operations​:

$ perl -lwe '$a="-0"; sprintf "%+.f\n", $a; my $b = "-0"; -$b; printf "%+.f%+.f%+.f\n", $a,- $a, - -$a; printf "%+.f%+.f%+.f\n", $b,- $b, - -$b;'
Useless use of sprintf in void context at -e line 1.
Useless use of negation (-) in void context at -e line 1.
-0+0-0
+0+0+0

Perl Info

Flags:
    category=core
    severity=low

Site configuration information for perl 5.18.1:

Configured by zefram at Thu Aug 15 19:33:26 BST 2013.

Summary of my perl5 (revision 5 version 18 subversion 1) configuration:
   
  Platform:
    osname=linux, osvers=3.2.0-4-amd64, archname=x86_64-linux-thread-multi
    uname='linux barba.rous.org 3.2.0-4-amd64 #1 smp debian 3.2.46-1 x86_64 gnulinux '
    config_args='-des -Dprefix=/home/zefram/usr/perl/perl_install/perl-5.18.1-i64-f52 -Duselargefiles -Dusethreads -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dusedevel -Uversiononly -Ui_db'
    hint=recommended, useposix=true, d_sigaction=define
    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='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.7.2', 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='cc', ldflags =' -fstack-protector -L/usr/local/lib'
    libpth=/usr/local/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib /usr/lib
    libs=-lnsl -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.15'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/home/zefram/usr/perl/perl_install/perl-5.18.1-i64-f52/lib/5.18.1/x86_64-linux-thread-multi/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector'

Locally applied patches:
    


@INC for perl 5.18.1:
    /home/zefram/usr/perl/perl_install/perl-5.18.1-i64-f52/lib/site_perl/5.18.1/x86_64-linux-thread-multi
    /home/zefram/usr/perl/perl_install/perl-5.18.1-i64-f52/lib/site_perl/5.18.1
    /home/zefram/usr/perl/perl_install/perl-5.18.1-i64-f52/lib/5.18.1/x86_64-linux-thread-multi
    /home/zefram/usr/perl/perl_install/perl-5.18.1-i64-f52/lib/5.18.1
    .


Environment for perl 5.18.1:
    HOME=/home/zefram
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/zefram/usr/perl/perl_install/perl-5.18.1-i64-f52/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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants