我经常使用 awk (gawk) 计算器:
calc(){ awk "BEGIN{ print $* }" ;}
在Ubuntu 14.04中,它以标准形式输出大数字,例如
$ calc 56777654409823*4674990588446667952594759939814064128
2.65435e+50
但现在(Ubuntu 15.10)输出不再是标准形式:
$ calc 56777654409823*4674990588446667952594759939814064128
265434999999999985120999032855606532558652107128832
发生了什么变化?有没有办法让我选择输出是否为标准形式?
答案1
使用 printf 代替。
calc(){ awk "BEGIN{ printf (\"%.5e\\n\", $*) }" ;}
答案2
您在 awk 的答案中看到的大部分都是噪音。
我们可以将这些数字与bc
一个设计用来进行任意精度数学运算的小型实用程序(大约 80kByte)进行比较:
$ calc(){ awk "BEGIN{print $*}"; }
$ math='56777654409823*4674990588446667952594759939814064128'
$ bc <<<"$math"; calc "$math"
265434999999999978394292482412066060207814915129344
265434999999999985120999032855606532558652107128832
265434999999999978394292482412066060207814915129344
265434999999999985120999032855606532558652107128832
请注意,唯一匹配的数字是前 16 位十进制数字,这是双精度(64 位)浮点数学的精度。
是的,gawk 可以执行任意精度的数学运算,但前提是它具有已编译进入程序和该程序称为跟他们选项。
检查 --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 称为:
calc(){ awk -M "BEGIN{print $*}"; }
不必使用 awk 或 gawk 检查多个详细信息,请使用:
使用BC
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