Por que você não pode usar o awk ou o perl one-liner para lidar com isso?
echo "$a $b" | awk '{ print ((($1/$2)^0.3) -1); }'
Estou usando o shell script e estou usando a seguinte expressão:
A='echo "(( (($a / $b) ^ 0.3) -1 ))" |bc -l'
Eu quero ter um número real como um expoente. Notei que, se eu coloco 0.3, ele é arredondado para um inteiro e assume o poder de zero. Da mesma forma, se eu usar 5,5 ou 5,9 no lugar de 0,3 na expressão acima, recebo a mesma resposta.
Como eu calculo o poder de um número com o expoente sendo um número real e não um inteiro
Você não pode usar diretamente o operador ^
para aumentar para um expoente não inteiro, no entanto, você pode usar a identidade
a b = e ln (a) × b
com e
sendo a base do logaritmo natural. bc
, quando chamado com a opção -l
, tem as funções e
e l
para computar base- e
exponenciação e o logaritmo natural respectivamente, portanto, para calcular a^b
, você apenas escreve e(l(a)*b)
.
Por exemplo, para 2 0.5 (raiz quadrada de 2):
$ echo 'e(l(2)*0.5)' | bc -l
1.41421356237309504878
Eu tenho medo que você não possa usar bc
para isso. Não suporta expoentes de ponto flutuante. Conforme explicado em man bc
:
expr ^ expr
The result of the expression is the value of the first raised to the second. The second expression must be an integer. [ ... ]
Então, você terá que usar outra coisa, como awk
:
awk -va="$a" -vb="$b" 'BEGIN{print ((a/b)^0.3)-1}'
ou, como sugerido por Dennis Jacob:
echo "$a $b" | awk '{print ((($1/$2)^0.3) -1);}'
Ou perl
:
perl -le 'print ((($ARGV[0]/$ARGV[1])**0.3)-1)' "$a" "$b"
ou
echo "$a $b" | perl -lane 'print ((($F[0]/$F[1])**0.3) -1)'
Você pode usar r em vez de bc:
A=$(echo "x=( ( ($a / $b) ** .3 ) -1 );print (x)" | r)
mas é claro que mais linguagens de programação podem resolver isso.
Tags bc shell-script