--- funcoeszz-5.9 2005-09-30 17:53:20.000000000 -0300 +++ zzpatchado 2005-10-08 07:59:35.000000000 -0300 @@ -797,12 +797,27 @@ # ---------------------------------------------------------------------------- # Calculadora: + - / * ^ % # mais operadores, ver `man bc` # Obs.: números fracionados podem vir com vírgulas ou pontos: 1,5 ou 1.5 -# Uso: zzcalcula número operação número +# Obs.: Se não for especificada a precisão, ela será de 2 casas decimais +# Uso: zzcalcula [--notacao] [--precisao número] número operação número # Ex.: zzcalcula 2,1 / 3,5 # zzcalcula '2^2*(4-1)' # 2 ao quadrado vezes 4 menos 1 +# zzcalcula --notacao 100000-26 +# zzcalcula --notacao --precisao 20 10000000-26 # ---------------------------------------------------------------------------- zzcalcula(){ zzzz -z $1 zzcalcula && return -[ "$1" ] && echo "scale=2;$*" | sed y/,/./ | bc | sed y/./,/ ; } +local num potencia=0 notacao=0 scale=2 casas +[ $1 = "--notacao" ] && notacao=1 && shift; +[ $1 = "--precisao" ] && scale=$2 && shift && shift; +[ "$*" ] && num=`echo "scale=$scale;$*" | sed y/,/./ | bc`; +if [ "$notacao" = 1 ]; then +while [ `echo "$num<1" | bc` = 1 ]; do potencia=`echo $potencia-1 | bc` +num=`echo "scale=60;$num*10" | bc`; done +while [ `echo "$num>10" | bc` = 1 ]; do potencia=`echo $potencia+1 | bc` +num=`echo "scale=60;$num/10" | bc`; done +casas=`echo "$scale+2" | bc` +num=`echo "$num" | bc | sed y/./,/ | sed -e "s/\(.\{$casas\}\).*/\1/"` +echo "$num x 10^$potencia"; else echo "$num" | sed y/./,/; fi +} # ----------------------------------------------------------------------------