第一章:The Missing Code Library--9.一个任意精度浮点计算器

   在脚本的编写过程当中,最经常使用的恐怕就是$(())了。它能够执行多种基本算术运算。这个表达式很是有用,特别是增长计数器时;而且它支持+ - * / %运算,不过不是全部的整数和小数都行。好比,下面的命令返回的是0,而不是0.5: shell

echo $((1/2))

 

   因此当一个计算结果须要更高的精度时,这也就意味着你接受了一个挑战。在命令行下没有几个好用的计算程序。除了,好比说,bc,一个不多有Unix用户学习的怪异程序。bc程序会把本身看成一个任意精度的计算器,它使用隐晦的错误信息追溯到Unix的开头,而且彻底没有提示,并且,一旦你使用它,它就假定你已经很是明了你正在作什么。但这一切都没有关系,咱们能够搞定。 学习

代码: ui

#!/bin/sh
 
 # scriptbc.sh -- 返回计算结果的'bc'封装器
 
 if [ $1 = "-p" ]; then
     precision=$2
     shift 2
 else
     precision=2     # 默认为小数点后2位
 fi 
 
 bc -q << EOF
 scale=$precision
 $*
 quit
 EOF
 
 exit 0

脚本如何工做:
这个脚本使用了here document方法,这个方法颇有用。标记符号<<容许你在脚本中包含后续输入,这些后续的输入就好像直接从输入流中得到的同样,在本例中,也就是容许用一种简单的机制让bc程序来处理命令。这一样也是咱们第一次阐述:在一个脚本内,如何利用命令的参数来加强一个命令的灵活性。这里,若是调用脚本时用了-p选项,它就会容许你给出一个你想要的精度。若是没有给出,程序就默认使用scale=2。 spa

当使用bc时,明白长度(length)和精度(scale)之间的区别尤为重要。对于bc来讲,length是数字中的总的个数,而scale则是小数点后的数字个数。所以,10.25的length是4,scale是2,而3.14159的length是6,scale是5。 命令行

默认状况下,bc的length是一个变量,但因为它的scale是0,因此若是不加任何设置的话,bc的工做方式和$(())看起来如出一辙。幸运的是,若是你在bc中设置了scale的话,你就会发现它有许多隐藏的力量,好比: code

bc      #命令行上键入bc
bc 1.06   #输出的bc版本
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.    #系统信息 
This is free software with ABSOLUTELY NO WARRANTY.              #系统信心
For details type `warranty'.                           #系统信息
scale=10       #设置精度
(2002-1962)*365   #给出计算表达式
         #上面算式的结果
/7       #再给出一个算式 
.7142857142   #上面算式的结果
quit         # 退出bc程序

为了容许从命令行访问bc,封装脚本必须禁止Copyright内容的输出。就算他们的输入不是来自终端(标准输入),大部分bc版本也知道应该禁止头部Copyright的输出。封装器还将scale设置为一个明确的值,给bc程序传了表达式,而后使用quit命令退出。 ip

运行脚本:
要运行这个脚本,只要给脚本程序一个数学表达式做为参数便可。 ci

运行结果: 数学

scriptbc.sh 14600/7
2085.71
scriptbc.sh -p 10 14600/7   
2085.7142857142
相关文章
相关标签/搜索