從前有一位聰明的僕人,他救了王子的性命。 國王承諾,只要僕人想得出來,他都會賞賜。 僕人知道國王熱愛西洋棋,便告訴國王,他想要一些麥粒。 在棋盤的第一格放一粒麥子,之後每一格的麥粒數量都是前一格的兩倍。
計算棋盤上的麥粒數量。
棋盤有 64 個格子。 第 1 格有 1 粒麥子,第 2 格有 2 粒麥子,第 3 格有 4 粒麥子,依此類推,每格加倍。
撰寫程式碼來計算:
預設情況下,awk 裡的數字是以雙精度浮點數表示的。這提供了 53 位元的精確度(請參閱手冊中的 Table 16.3)。很遺憾,這不足以完成這道練習(劇透警告:其中一個測試需要 63 位元的精確度)。
「精確度不足」看起來像這樣:
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
如果相關的函式庫已經編譯進 awk 執行檔,GNU awk 就有能力使用任意精度的數字。檢查你的 awk 版本,看看有沒有「GNU MPFR」:
$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...
如果有的話,用 -M 選項啟用這項能力:
$ gawk -M 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
OK
那如果我的 awk 沒有 -M 呢?你得呼叫外部程式來做任意精度運算,例如 bc。做法範例請參閱 Using getline into a Variable from a Pipe 一節。