使用BC

使用BC

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

    15.5 用gawk进行任意精度整数算术

您必须将 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

相关内容