
Ubuntu 14.04.1 LTS 64ビットbashコマンドプロンプトに次のスクリプトがあります。
S=0.030
F=0.150
N=10
reso=20
DIFF=`echo "scale=3; $F - $S" | bc -l`
df=`echo "scale=3; $DIFF / $N" | bc -l`
is=`echo "scale=3; $S / $df" | bc -l`
if=`echo "scale=3; $F / $df" | bc -l`
cd wgdisp-out
for i in `seq 0 $N`
do
f=`echo "scale=3; $S + $i * $df" | bc -l | awk ' sub("\\.*0+$","") '`
#h5totxt hsli0$f.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | sed -n '/^[[:digit:]]/p' | cut -d , -f 1
echo $f
done
fをで表示したいです0.03, 0.042, 0.054, .... 0.138, 0.15
。たとえば、fがファイル名に使用されるため、これが重要ですhsli0.03.h5
。誰でも正しい方向を教えてもらえますか?私はシェルの算術に慣れていません。
編集する:次の設定を試しましたが、目的の出力を生成できず、サイズ変更オプションもbc
機能しないようです。
f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./' -e 's/$^\/0/./'`
編集2:機能させるには、次の単一のコマンドを使用します。
f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./;s/[0]*$//g'`
答え1
は制限に使用される特殊変数bc
です。scale
スケール(カンマの後の桁数) /
(除算)などの一部の演算子の結果.表示された数値の精度ではなく、bc
計算に使用されます。
たとえば、scale=1; 1/3
結果は0.3
(3/10
)への距離が長いです1/3
。
計算には大規模な値を使用する必要があり、表示される場合にのみ減らす必要があります(たとえば、scale
末尾で除算)。1
比較する:
$ echo "scale=100; r=1/3*300; scale=3; r/1" | bc
99.999
そして:
$ echo "scale=3; 1/3*300" | bc
99.900
私は次のように書きます:
n=10
echo "
s = 0.030
f = 0.150
n = $n
r = 20
scale = 100
d = (f - s) / n
scale = 3
for (i = s; i <= f; i += d) i/1" |
bc |
sed 's/^\./0./;s/0*$//' |
while read f; do
h5totxt "hsli$f.h5" | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200
done
答え2
Bashの浮動小数点サポートは非常に悪いです。ただし、以下を引き続き使用できますprintf
。
printf '%5.3f\n' $f
printf '%.3g\n' $f
前にゼロを追加するには、パラメータ拡張を使用できます。
f=${f/#./0.}
# if negative numbers are possible, too
f=${f/#-./-0.}