[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Arithmetic pow results incorrect in arithmetic expansion.
From: |
Hyunho Cho |
Subject: |
Re: Arithmetic pow results incorrect in arithmetic expansion. |
Date: |
Sat, 9 Jan 2021 14:45:49 +0900 |
I didn't know that all other shells work the same.
Thanks for the clarification.
2021년 1월 9일 (토) 오후 2:29, Lawrence Velázquez <vq@larryv.me>님이 작성:
> > On Jan 8, 2021, at 11:19 PM, Hyunho Cho <mug896@gmail.com> wrote:
> >
> > Machine: x86_64
> > OS: linux-gnu
> > Compiler: gcc
> > Compilation CFLAGS: -g -O2
> > -fdebug-prefix-map=/build/bash-a6qmCk/bash-5.0=.
> > -fstack-protector-strong -Wformat -Werror=format-security -Wall
> > -Wno-parentheses -Wno-format-security
> > uname output: Linux EliteBook 5.4.0-42-generic #46-Ubuntu SMP Fri Jul
> > 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
> > Machine Type: x86_64-pc-linux-gnu
> >
> > Bash Version: 5.0
> > Patch Level: 17
> > Release Status: release
> >
> > ####################################################################
> >
> > i have tested below in gnome calculator, Qalculate, gawk, perl
> > and all results in -4 but bash is 4
> >
> > $ awk 'BEGIN { print -2 ^ 2 }'
> > -4
> >
> > $ perl -E 'say -2 ** 2'
> > -4
> >
> > $ echo $(( -2 ** 2 )) # only bash results in 4
> > 4
>
> The bash results disagree with awk and perl (and, admittedly, common
> mathematical convention), but the man page clearly states that unary
> minus has higher precedence than exponentiation, so this behavior
> is intentional.
>
> The operators and their precedence, associativity, and values are
> the same as in the C language. The following list of operators is
> grouped into levels of equal-precedence operators. The levels are
> listed in order of decreasing precedence.
>
> id++ id-- variable post-increment and post-decrement
> - + unary minus and plus
> ++id --id variable pre-increment and pre-decrement
> ! ~ logical and bitwise negation
> ** exponentiation
> [remaining operators follow]
>
> Additionally, this precedence is consistent with other shells.
>
> % bash --version | head -n 1
> GNU bash, version 5.0.17(1)-release (x86_64-apple-darwin18.7.0)
> % bash -c 'printf %s\\n "$((-2 ** 2))"'
> 4
>
> % ksh --version
> version sh (AT&T Research) 93u+ 2012-08-01
> % ksh -c 'printf %s\\n "$((-2 ** 2))"'
> 4
>
> % zsh --version
> zsh 5.8 (x86_64-apple-darwin18.7.0)
> % zsh -fc 'printf %s\\n "$((-2 ** 2))"'
> 4
> % zsh -f -o C_PRECEDENCES -c 'printf %s\\n "$((-2 ** 2))"'
> 4
>
> The zshmisc(1) man page even goes out of its way to address this.
>
> Note the precedence of exponentiation in both cases is below that of
> unary operators, hence `-3**2' evaluates as `9', not `-9'. Use
> parentheses where necessary: `-(3**2)'. This is for compatibility
> with other shells.
>
> I don't know why things shook out this way, but it sure seems like
> the ship has sailed.
>
> vq
>