Awk

為什麼較新版本的 awk 列印大整數而不是小數?

  • October 6, 2016

我經常使用 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

引用自:https://unix.stackexchange.com/questions/275045