[英]awk read float precision: cannot read small floats, e.g. 4e-320
我無法讓awk
或gawk
以科學計數法讀取小浮點數並將它們正確解釋為浮點數。
我只想用 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 的門檻,但是awk
和gawk
都沒有拒絕它!
我查了(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-int
和big-float
的awk
可以正常處理過濾器
它將過濾器從丟棄所有負值的過濾器修改為僅按數字大小過濾的過濾器,跳過必須首先獲得絕對值的額外步驟:
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.