後で書式を設定するには、下が 10 のログを計算する必要があります。これまではそのように良かった:
$ awk 'BEGIN { print log(1000) / log(10) }'
3
$ awk 'BEGIN { print log(1001) / log(10) }'
3.00043
小数点以下の桁数を削除する必要があるため、以下を使用しますint()
。
$ awk 'BEGIN { print int(log(1001) / log(10)) }'
3
今まではそんなに良くなった。しかし、これは何ですか(!):
$ awk 'BEGIN { print int(log(1000) / log(10)) }'
2
誰でもこの丸めエラーまたはこれが何であるかを説明できますか?
問題を解決する正しい方法は何ですか?
よろしくお願いします!
答え1
丸めは決して簡単なことではありません。精密ただし、最大15桁(53桁の歌手の場合)では、正しい数に向かって近似(丸め)が発生する必要があります。
$ printf '%s\n' 999 1000 1001 | awk '{ v=log($1) / log(10); printf("%.15g\n",v) }'
2.99956548822598
3
3.00043407747932
したがって、最も近い整数に四捨五入すると(ゼロに丸め、負の数も修正されます)、%i
必要な整数を取得できます。
$ printf '%s\n' 999 1000 1001 |
awk '{
v=log($1) / log(10);
result=sprintf("%.15g",v);
printf("%-15s %i\n",v, result)
}
'
2.99957 2
3 3
3.00043 3
これは最大14桁まで正しく機能する必要があります(awkのデフォルトの53ビットシンガーを使用して範囲を拡張しようとしないでください。場合によっては失敗する可能性があります)。