2019年6月30日 星期日

Unix 内置计算器:bc


Unix最有用(但受到最少欣赏)的程序之一就是Unix内置计算器:bc。它是一个功能齐全,可编程的科学计算器。一旦学会了使用bc,您就会发现它是做快速计算的无价之宝。
如果使用的是桌面环境,那么您极有可能发现一些基于GUI的计算器程序可供使用。这些程序看上去十分漂亮——它们其实是在计算机屏幕上绘制了一个计算器图像,但是对于一步一步的工作或者大量的计算来说,bc要更好用些。此外bc是基于文本的程序,这意味着可以在任何终端的命令行使用它。
技术小结:bc是一个完全可编程的数学解释器,它提供扩展精度。每个数字可以按照所需要的数字位存储,而且小数点右边可以达到100位。可以对2到16各种进制的数进行操作,而且还可以方便的从一种进制转换到另一种进制。
使用bc时,既可以借助键盘输入进行运算(这种运算会被立即处理),也可以运行文件形式存储的程序。bc的编程语法与C语言相似,bc中可以使用函数并使用递归。bc中还有数组,局部变量及其全局变量。在bc中还可以编写自己的函数并存储成文件,然后bc可以加载它们并自动解释。

Unix内置计算器bc自带了一个函数库,提供有下述函数:sin, cos, arctan, ln,指数贝塞尔函数
要了解更多的信息,可以使用下述命令显示联机手册中有关bc命令的描述:

man bc

1. 使用Unix内置计算器bc尽享计算
大多数时候,使用bc进行的都是常规计算,这比较简单。启动bc程序时,需要输入命令:

bc

如果您希望使用bc内置的数学函数库,那么启动程序时需要使用-l(library,库)选项:

bc –l

bc一旦启动,就没有具体的提示了。可以一个接一个的输入算式,每按下<Return>键,bc就计算刚才键入的算式,并显示答案。例如,如果输入了:

122152 + 70867 + 122190
那么bc将显示:

315209

现在可以输入一个新算式了。如果希望在同一行上输入不止一个算式,那么各个算式之间需要以分号隔开。bc将把每个算式的结果风别显示在一个单独的行上,例如,如果输入:

10+10;20+20

那么将显示:

20
40


当不再使用Unic内置计算器bc时,可以通过告诉他没有数据了而结束程序。这一操作通过按^D(eof键)实现。另外,也可以输入quit命令。
下表为Unix计算器bc中可用的基本运算。其中加法,减法,乘法,除法和平方根都直接明了,和平时一样。取模运算是除法运算的余数。例如,53%10等于3。指数运算是对一个数乘方。例如,3^2的意思是32次幂。乘方必须是一个整数,但是可以是负数,如果用负数乘方,则要用括号将负数括起来,如3^(-1)


运算符
含义
+
加法
-
减法
*
乘法
/
除法
%
取模
^
指数
Sqrt(x)
平方根
除了基本的运算之外,bc函数库中还有几个有用的函数。这些函数如下表所示:bc遵循一般的代数运算规则:乘法,除法,取模的优先级高于加法和减法,指数的优先级最高。和代数运算一样,可以使用括号改变运算的顺序。因此,1+2*3等于7,而(1+2)*3等于9
函数
含义
s(x)
x的正弦;其中x的单位是弧度
c(x)
x的余弦;其中x的单位是弧度
a(x)
x的反正切;其中x的单位是弧度
ln(x)
x的自然对数
j(n,x)
xn次正切贝塞尔函数

bc-l如果需要使用库中的函数,则需要使用下述命令启动Unix内置计算器bc:
当使用这个命令时,bc自动的将标度因子(scale factor)设置为20正如前面所述,bc可以进行人任意精度的计算。也就是说,它可以根据需要使用任意的位数进行运算。例如,您可以要求它将两个100位的数字相加。
但是,默认情况下,bc假定做整数运算。也就是说,bc将忽略小数点右边的数字。如果希望使用小数值,那么您需要设置一个标度因子,告诉bc您希望保留小数点后多少位。根据需要,您可以将scale设置为希望的标度因子值。
例如,要保留小数点后面3位,可以输入:

scale = 3

从现在起,随后所有的运算都是三位小数运算,后面的数字都被舍去如果希望查看标度因子的值,只需要简单的输入:

scale

bc将显示scale的当前值。

在启动Unix内置计算器bc时,scale的值被自动设置为0。一个常见的错误就是开始计算时没有设置标度因子。例如假设您刚启动了bc,输入了:

150/60

bc显示:

2

现在您再输入:

35/60

bc显示:

0

最后,您弄清楚了问题的所在。您的结果被取舍了,因此您需要设置一个合适的标度因子:

scale=3

这时bc将显示您希望看到的结果。
记住,当使用数学函数库时,bc启动时自动将标度因子设置为20。基于这一原因许多人通常使用bc-l启动bc,即使他们不使用数学函数库。

2. 在Unix 内置计算器bc中使用变量
bc不仅仅是一个计算器。它实际上还是一种功能性完整的数学编程语言。跟所有的编程语言一样,bc允许设置并使用变量。
变量由变量名和变量值组成。在bc中,变量名由一个小写的字母构成。也就是说,只有26个变量,从a到z(一定要确保不使用大写字母,当使用基时才使用它们——参见下面)。
在设置变量的值时,使用=(等号)字符。例如,将变量x的值设置为100,可以输入:

x=100
显示变量的值时,只需输入变量名。例如:

x

bc将显示变量x的当前值。默认情况下,在变量没有赋值之前,bc假定所有变量值为0。
变量的使用非常简单,并且还增强了bc的功能。下面举例说明它的基本原理。
Gaipajama王公被Unix提供的功能深深打动。作为他尊重的表示,他决定为您提供您体重两倍的红宝石(每磅值1000美元)以及你体重1/3的钻石(每磅值2000美元)。很显然,Gaipajama王公按批发价购买的宝石。
您的体重是160磅,那么王公的礼物值多少钱?为了解决这个问题,可以启动bc并输入:

w=160
r=(w*2)*1000
d=(w/3)*2000
r+d


答案显示为:

426000

因此,送给您的礼物值426000美元
但是等一等,一旦王公意识到他的承诺代价太大时,他会说:“我说过送给您的礼物是以磅为单位计算的吗?我说的是以公斤计算”。
因为1公斤等于2.2磅,所以您很快地将w变量的值转换成公斤制:

w=w/2.2

现在再重新输入红宝石和钻石的值:

r=(w*2)*1000
d=(w/3)*2000
r+d


新的答案显示为:

192000

因此,由于采用公制单位,所以王公节省了234000美元。同时,您向他演示了如何基于旧为变量设置一个新值,在这个例子中,即 w=w/2.2

3. 在Unix 内置计算器bc中使用不同的基
一般情况下,bc计算时使用10作为基(如果还不知道基是什么,那么您可以跳过),但是有时候,您可能需要另一基进行的运算。例如,在计算机科学中,有时候需要基16(16进制),基8(八进制)或者基2(二进制)。
bc允许对输入和输入指定不同的基。具体操作时,需要设置两个特殊的变量:ibase是用于输入的基;obase是用于输出的基。
例如,如果希望以基16显示答案,可以输入:

obase=16

如果希望以基8输入数字,则需要输入:

ibase=8
上面说过,默认情况下,在设置变量之前,变量的值为0。但是ibaseobase例外:这两个变量都被自动地设置为10,这样就可以使用基10进行计算。如果希望以另一种基进行计算,则需要设置两个变量的值,值的范围为2~16。
您还应该明白ibaseobase的值并不影响bc内部对数值的操作。他们唯一的效果就是指定输入和输出过程中数值如何转换。
对于大于或等于10的基值,bc分别使用大写字母A,B,C,D,E和F表示值10,11,12,13,14和15。记住一定要使用大写字母,如果使用了小写字母,那么bc将会认为它是变量,从而使结果出错。
为了方便起见,无论设置的输入是什么,都可以使用这些大写字母。例如,即使您现在使用的基是10,表达式A+1的值也是11。
和其他变量一样,直接输入ibaseobase自身就可以获得它们当前值:

ibase; obase

但是,一定要小心。因为一旦设置了obase的值,所有的输出都将以这个基显示,显示的值可能会对您产生麻烦。例如,如果您输入:

obase=16
obase


那么您将看到:

10

这是因为此时所有的输出都以基16显示,而在基16中,值“16”就表示为10。同理,一旦修改了ibase,在输入时也必须特别小心,例如,假设您设置了:

ibase=16

现在希望将obase设置为10,因此您输入:

obase=10

但是,您忘了现在的输入是16,而10在基16中其实是“16”。因此,obase还是被设置成基16。
为了避面出现这样的错误,可以使用字母A到F,无论ibase的值是多少,它们仍然是原来的值。因此,如果事情出现了混乱,您总可以这样重新设置基:

obase=A; ibase=A
下面举两个修改基的例子。在第一个例子中,希望将两个十六进制(基 16)的数F03E和3BAC加在一起。输入:

obase=16
ibase=16
F03E + 3BAC


bc显示答案:

12BEA
在第二个例子中,希望将十六进制的数FFCI转换成二进制(基2)。重新设置基:

obase=A; ibase=A

然后输入:

obase=2; ibase=16
FFC1

bc显示答案:

1111111111000001
提示:
bc不仅仅是一个计算器程序。它还是一个复杂的数学编程系统。有自己内置的编程语言。在本章中,只解释了最基本的特征。如果您有时间,那么建议您研究一下bc,看看它还能做些什么。
其中最好的方式就是阅读bc的联机手册。命令如下:

man bc






沒有留言:

張貼留言