BCスケール:丸めを避ける方法は? (小二項確率計算)

BCスケール:丸めを避ける方法は? (小二項確率計算)

次のコードは、n回の試行でk回の成功イベントの2項確率を計算します。

n=144
prob=$(echo "0.0139" | bc)

echo -e "Enter no.:" 
read passedno

k=$passedno
nCk2() {
    num=1
    den=1
    for((i = 1; i <= $2; ++i)); do
        ((num *= $1 + 1 - i)) && ((den *= i))
    done
    echo $((num / den))
}

binomcoef=$(nCk2 $n $k)

binprobab=$(echo "scale=8; $binomcoef*($prob^$k)*((1-$prob)^($n-$k))" | bc)

echo $binprobab

$passedno(=k) を "5" と入力すると結果は "0.03566482" ではなく 0 と表示され、 "4" と入力すると結果は ".07261898" と表示されます。

出力の丸め値を取得せずに10進数8桁の指定された精度で出力を印刷するにはどうすればよいですか?

ベストアンサー1

はじめに

116から7のパーセンテージを計算するとします。
7を116で割り、その結果に100を掛けます。結果は
次のようになります。

ここに画像の説明を入力してください。

bc -l <<< '(7/116)*100'
6.03448275862068965500

質問

小数点以下2桁まで正確にしたいので、scale=2;次のように追加します。

ここに画像の説明を入力してください。 ただし、次のような奇妙な結果が表示されます。

bc -l <<< 'scale=2; 100*(7/116)'
6.00

値を上げようとしていますscale

bc -l <<< 'scale=3; 100*(7/116)'
6.000

何らかの理由でscale=4;2つの位置まで正確ですが、次のような末尾の0sがあります。

bc -l <<< 'scale=4; 100*(7/116)'
6.0300

理由

計算の最初の部分は小数点以下の2桁まで正確で、残りは切り捨てられます。 ここに画像の説明を入力してください。 ここに画像の説明を入力してください。


解決策

理想的な解決策は、浮動小数点計算を基本的にサポートするbashことです。shなぜまだこれをやっていないのですか?わかりません。そうしないのが愚かなようです。それまでは、次のものを使用できます。

紀元前

  1. 変数を定義します。
  2. 設定scale
  3. 1で割ります。
bc -l <<< "x=(7/116)*100; scale=2; x/1"
6.03

印刷機能

  1. bcコマンドを置き換えるには、コマンドを...で"$(囲みます)"
  2. に渡してくださいprintf
  3. %.2f型文字列に使用されます(小数点以下の2桁までの精度を表す%f浮動小数点数を表します.2(例scale=2:))。
printf '%.2f\n' "$(bc -l <<< '(7/116)*100')"
6.03

アッ

  1. 注:awk操作もできます
  2. echo相互作用ループが何とか壊れていると思います。これを行うより良い方法があるかもしれません。
  3. 浮動小数点を制御することはできません。私はそれが何とか成し遂げられると確信しています。
echo | awk '{print 100*(7/116)}'
6.03448

おすすめ記事