#!/bin/bash # # script bash para facilitar o uso do bc # # exemplo: # c "4*(sin(3)^8)" s # one=$1 #lista de constantes: s, c, a, l, e, j sao utilizados pelo bc m para memoria one=${one//k/1.38065E-23} # Boltzmann entre 6488 e 6516 fica 6500 2010 >> 1.3806488E-23 2013 >> 1.38065156E-23 Metrologia v50 n4 one=${one//pi/3.14159265358979323846264338327950288419716939937511} #pode usar 4*a(1) ou 355/113 one=${one//Eu/2.71828182845904523536028747135266249775724709369996} one=${one//sin(/s(} one=${one//cos(/c(} one=${one//atan(/a(} one=${one//ln(/l(} ######## memoria m ########### # alternativa >> o bc utiliza "last" para o ultimo resultado memfile="/tmp/m" if [ ! -f $memfile ]; then echo "" > $memfile fi read mem < $memfile if [ ${#mem} -gt 0 ]; then one=${one//m/$mem} # substitui a letra m pelo conteudo da memoria else one=${one//m/***mem empty ***} # substitui a letra m pelo conteudo da memoria fi ########################### one=${one//E/*10^} # substitui "E" por *10^ trunc=4 if [[ ${#2} -gt 0 && $2 -gt 0 ]] then trunc=$2 fi if [ ${#1} -gt 2 ] then if [ "$2" != "s" ]; then trunc=4 if [[ $2 -gt 0 ]]; then trunc=$2 fi result=$(bc -l <<< "scale=$trunc;$one") else #E notation trunc=100 result=$(bc -l <<< "scale=$trunc;$one") r=${result/./,} r=${r//$'\n'/} r=${r//\\/} result=$(printf "%.4E\n" $r) fi result=${result/,/.} result=${result/E+/E} result=${result//E00/E0} result=${result//$'\n'/} result=${result//\\/} echo "$result" > $memfile #salva resultado no arquivo /tmp/m echo " $one = $result" echo "" echo "resultado na memoria >> use m " else echo " entre com a expressao matematica a ser avaliada" echo " ao utilizar parenteses use aspas \"(2+3)*5\" " echo " o segundo argumento e' qtd de casas que ira truncar ou s para notacao E" echo " truncamento default = 4 digitos" echo " o resultado fica armazenado em /tmp/m " echo " se tem 1 em /tmp/m entao c m+3 = 4" echo " se tem 3E3 em /tmp/m entao c \"(m)+3\" = 3003" echo "" echo " c 1/6 = .1666" echo " c 1/6 2 = .16 >> obs: o scale nao arredonda, ele trunca!" echo " c 1/6 44 = .16666666666666666666666666666666666666666666" echo "" echo " c \"sqrt(36)\" = 6.0000 >> raiz quadrada" echo " c 3^3 = 27 >> potencia somente expoentes inteiros" echo " c \"(2+3)^2/2\" = 12.5 " echo " c \"(1+2)^3\" = 27" echo " c 1E3/4 = 250.000" echo " c \"s(3.14159/4)\" = \"sin(3.14159/4)\" = .7070 >> seno angulo radianos" echo " c \"c(pi/4)\" = \"cos(pi/4)\" = .7070 >> coseno angulo radianos" echo " c \"a(pi/4)\" ou \"atan(pi/4)\" = .7070 >> arco tangente" echo "" echo " c \"Eu+1\" 20 = 3.71828182845904523536 >> Euler + 1" echo " c \"l(Eu)\" = 1 >> logaritmo base 'e' Euler" echo " c \"ln(Eu)\" = 1 >> logaritmo natural base 'e' (sim igual ao anterior l())" echo " c \"j(n,x)\" = \"j(4,2)\" 11 = .03399571980 >> funcao de Bessel n de x " echo "" echo " Eu = 2.71828182845904523536028747135266249775724709369996 Eu = \"e(1)\" Euler " echo " pi = 3.14159265358979323846264338327950288419716939937511 Pi == \"4*atan(1)\" " echo " k = 1.38065E-23 Boltzmann veja Podesta, et al, Metrologia (v50,n4) 2013 " echo "" echo " c Eu/4 = .6795 " echo " c pi/2 = 1.5707 " echo " c k/2 32 = .00000000000000000000000690324260" echo "" echo " obs: e(1) e 4*a(1) apresentam vantagens ao utilizar a precisao interna do bc" echo " algumas contas modificando a qtd de digitos sao esclarecedoras! " fi