簡體   English   中英

awk 讀取浮點精度:無法讀取小浮點數,例如 4e-320

[英]awk read float precision: cannot read small floats, e.g. 4e-320

我無法讓awkgawk以科學計數法讀取小浮點數並將它們正確解釋為浮點數。

我只想用 awk 將 output 數字超過一個小閾值。

示例

考慮以下輸入:

4
3e-20
4.5e-320
3
1e-10

我想以 1e-15 為閾值,所以我執行以下操作:

echo -e "4\n3e-20\n4.5e-320\n3\n1e-10"  |  awk '$1 > 1e-15'

這給出了 output:

4
4.5e-320
3
1e-10

當然,4.5e-320 沒有通過 1e-15 的門檻,但是awkgawk都沒有拒絕它!

我查了(g)awk浮點精度。 它似乎適用awk 中的算術運算。

因此,用gawk -v PREC="double" '$1 > 1e-15'替換awk '$1 > 1e-15' 1e-15' 也失敗了。 它也因PREC="quad"而失敗

因此,我得出結論, (g)awk不是將 4.5e-320 作為浮點數讀取,而是將字符串讀取為字符串?

我從 awk 版本 3.1.5 中得到了預期的 output。

我從 awk 版本 3.1.7 得到您的 output。

您可以通過向字符串添加零來強制 awk 將字符串轉換為數字。

所以試試這個 awk 腳本吧:

printf '4\n3e-20\n4.5e-320\n3\n1e-10\n' | awk '$1+0 > 1e-15'

可以更簡單地說:

  printf '4\n3e-20\n4.5e-320\n3\n1e-10\n' 
 awk '1e-15 < +$_' # mawk or gawk or awk '1e-15 < +$+_' # nawk
4
3
1e-10

另一種方法是乘以它的倒數 -

  • 不能正常處理big-intbig-floatawk可以正常處理過濾器

  • 它將過濾器從丟棄所有負值的過濾器修改為僅按數字大小過濾的過濾器,跳過必須首先獲得絕對值的額外步驟:

     printf '12345e+76543\n-996633e+224466\n6543e-4567\n4' '\n3e-20\n4.5e-320\n-248163264\n3\n1e-10\n' |
 mawk '$++NF = int(1e15 * $_)? "pass-filter": "-"' OFS='\r\t\t\t'
12345e+76543        pass-filter
-996633e+224466     pass-filter
6543e-4567          -
4                   pass-filter
3e-20               -
4.5e-320            -
-248163264          pass-filter
3                   pass-filter
1e-10               pass-filter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM