Shell Scripting: calcula o poder de um número com um número real como um expoente

2

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

    
por Syed Moez 30.01.2016 / 00:38

4 respostas

4

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); }'
    
por 30.01.2016 / 01:01
5

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
    
por 31.01.2018 / 15:21
3

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)'
    
por 30.01.2016 / 01:13
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.

    
por 30.01.2016 / 02:59