log() で int() を使用する awk 丸めエラー

log() で int() を使用する awk 丸めエラー

後で書式を設定するには、下が 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ビットシンガーを使用して範囲を拡張しようとしないでください。場合によっては失敗する可能性があります)。

おすすめ記事