분수(첫 번째 루프에서 분수가 계산됨)를 소수점 이하 거듭제곱(두 번째 루프)으로 올리고 싶지만 결과는 항상 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
시도와 관련된 몇 가지 문제가 있습니다. 이를 거듭제곱 상수로 올릴 때 즉각적인 질문은 이를 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 }'