Я хочу возвести дробь (дробь вычисляется в первом цикле) в десятичную степень (второй цикл), однако в результате я всегда получаю 1. Я также хочу сохранить вывод второго цикла в массиве. Любые идеи, как обойти это? Спасибо!

#
# vector of vertical pressure levels
levs=($(seq 200.0 50.0 900.0))
printf "%s\n" "${levs[@]}"
#
# exponent for dry air
rho=$(bc -l <<<'e(l(0.0819)*0.5)')
echo $rho
#
# calculate fraction of P_surf/P_i from Poisson equation for each vertical pressure level
val3=()
#
for i in "${levs[@]}"
 do
   echo $i
   val3+=($(bc -l <<<"1000.0/$i"))
   echo "$val3"
 done
printf "%s\n" "${val3[@]}"
#
# raise fraction of P_surf/P_i to the rho power for dry air (#bc <<< "2 ^ 3")
pow=()
#
for j in "${val3[@]}"
 do
   echo $j
   echo $rho
   pow+=($(bc <<<"$j^rho"))
   #echo $((i*rho))
   echo "$pow"
 done
# 
1
Inian 9 Окт 2019 в 15:50

1 ответ

Лучший ответ

Есть несколько проблем, связанных с вашей попыткой. Непосредственная проблема заключается в использовании rho в качестве буквальной строки при повышении ее в качестве степенной константы до bc.

bc <<<"$j ^ $rho"

Даже с этим код не работает, bc не принимает дробные числа в степени. Вы получаете сообщение об ошибке non-zero scale in exponent.

Вы можете использовать awk (проверено на варианте GNU) для того же и применить форматирование с одинаковой точностью, как

awk -v base="$j" -v xp="$rho" 'BEGIN{ printf "%.20f", base ** xp }'
1
Inian 9 Окт 2019 в 13:43
1
OP уже использует e(l(0.0819)*0.5) вместо 0.0819 ^ 0.5 (где они могли бы использовать sqrt(0.0819)), так что здесь можно было бы также использовать e(l($j)*$rho)
 – 
Stéphane Chazelas
9 Окт 2019 в 13:50
Спасибо, Иниан и Стефан!
 – 
Maria Karypidou
9 Окт 2019 в 14:01