私はbcが最初の0を印刷する方法についてのスレッドを読んだが、それは私が望むものではありません。私はもっと欲しい...
小数点8桁の浮動小数点数を返す関数が必要です。私はawkまたは他の公正なアプローチを使用するすべてのソリューションで開いています。私が意味するものを説明する例は次のとおりです。
hypothenuse () {
local a=${1}
local b=${2}
echo "This is a ${a} and b ${b}"
local x=`echo "scale=8; $a^2" | bc -l`
local y=`echo "scale=8; $b^2" | bc -l`
echo "This is x ${x} and y ${y}"
# local sum=`awk -v k=$x -v k=$y 'BEGIN {print (k + l)}'`
# echo "This is sum ${sum}"
local c=`echo "scale=8; sqrt($a^2 + $b^2)" | bc -l`
echo "This is c ${c}"
}
時にはa
合計がb
あり、戻り値はすべてゼロを維持する0.00000000
必要があります。c
この現象が発生した場合、このコードは次の出力を返します。
This is a 0.00000000 and b 0.00000000
This is x 0 and y 0
This is c 0
印刷したい
This is a 0.00000000 and b 0.00000000
This is x 0.00000000 and y 0.00000000
This is c 0.00000000
助けてくれてありがとう!
ベストアンサー1
bcでは、太陽は1で割ることです。
$ bc -l <<<"scale=8; x=25*20; x"
500
$ bc -l <<<"scale=8; x=25*20; x/1"
500.00000000
したがって、スクリプトは次のようになります。
hypothenuse () {
local a b c x y
a=${1}; b=${2}
echo "This is a ${a} and b ${b}"
x=$(echo "scale=8; $a^2/1" | bc -l)
y=$(echo "scale=8; $b^2/1" | bc -l)
echo "This is x ${x} and y ${y}"
# local sum=`awk -v k=$x -v k=$y 'BEGIN {print (k + l)}'`
# echo "This is sum ${sum}"
c=$(echo "scale=8; sqrt($a^2 + $b^2)/1" | bc -l)
echo "This is c ${c}"
}
$(…)
代わりに使用することをお勧めします`…`
。
ただし、これでさえ値が0の場合は失敗します。
最善の解決策は、bcに20の尺度を与え(bc -lから)、bcへの単一の呼び出しに必要なすべての数学を実行し、必要に応じて出力をフォーマットすることですprintf
。はい、printf
浮動小数点形式を指定できます。
バッシュを想定
hypothenuse () { local a b c x y
a=${1:-0} b=${2:-0}
read -d '' x y c < <(
bc -l <<<"a=$a; b=$b; x=a^2; y=b^2; c=sqrt(x+y); x;y;c"
)
printf 'This is a %14.8f and b %14.8f\n' "$a" "$b"
printf 'This is x %14.8f and y %14.8f\n' "$x" "$y"
printf 'This is c %14.8f \n' "$c"
}