Awk
為什麼較新版本的 awk 列印大整數而不是小數?
我經常使用 awk (gawk) 計算器:
calc(){ awk "BEGIN{ print $* }" ;}
在 Ubuntu 14.04 中,它以標準格式輸出大數字,例如
$ calc 56777654409823*4674990588446667952594759939814064128 2.65435e+50
但是現在(Ubuntu 15.10)輸出從來不是標準形式:
$ calc 56777654409823*4674990588446667952594759939814064128 265434999999999985120999032855606532558652107128832
發生了什麼變化?有沒有辦法讓我選擇輸出是否為標準格式?
請改用 printf。
calc(){ awk "BEGIN{ printf (\"%.5e\\n\", $*) }" ;}
您在 awk 的回答中看到的主要是噪音。
我們可以將這些數字與
bc
一個旨在進行任意精度數學運算的小型實用程序(大約 80kByte)進行比較:$ calc(){ awk "BEGIN{print $*}"; } $ math='56777654409823*4674990588446667952594759939814064128' $ bc <<<"$math"; calc "$math" 265434999999999978394292482412066060207814915129344 265434999999999985120999032855606532558652107128832
265434999999999978394292482412066060207814915129344 2654349999999999
85120999032855606532558652107128832請注意,唯一匹配的數字是前約 16 個十進制數字,這是雙精度(64 位)浮點數學的精度。
是的,gawk 可以執行任意精度的數學運算,但前提是已將其編譯到程序中並且****使用 -M選項呼叫程序。
- 檢查 –version 是否包含“GNU MPFR 和 GNU MP”。
gawk --version -| GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2) -| Copyright (C) 1989, 1991-2015 Free Software Foundation.
- 使用選項呼叫 gawk
-M
。使用 gawk閱讀15.5 任意精度整數運算。
您必須將 gawk 稱為:
calc(){ awk -M "BEGIN{print $*}"; }
不必使用 awk 或 gawk 檢查多個細節,請使用:
使用公元前
bc 是一個用於以任意精度進行數學運算的實用程序:
bc <<<'56777654409823*4674990588446667952594759939814064128' 265434999999999978394292482412066060207814915129344
計算 pi 到 200 位(1 的反正切的 4 倍):
$ bc <<<"scale=200;4*a(1)" 3.141592653589793238462643383279502884197169399375105820974944592307\ 81640628620899862803482534211706798214808651328230664709384460955058\ 223172535940812848111745028410270193852110555964462294895493038196
使用真正的計算:
在您定義的函式之後,如果您編寫以下內容,您將看到此列表:
$ type -a calc calc is a function calc () { awk -M "BEGIN{print $*}"; } calc is /usr/bin/calc
只需取消定義功能:
$ unset -f calc $ type calc calc is /usr/bin/calc
在那裡你可以這樣做:
$ calc '2* 3' 6 $ calc '2 ^ 127 - 1' # mersene prime. 170141183460469231731687303715884105727 $ calc '56777654409823*4674990588446667952594759939814064128' 265434999999999978394292482412066060207814915129344
這與 bc 的答案完全相同:
$ math='56777654409823*4674990588446667952594759939814064128' $ bc <<<"$math"; echo $(calc "$math") 265434999999999978394292482412066060207814915129344 265434999999999978394292482412066060207814915129344