keep_simple

导航

linux的计算器bc命令


  问题引入——处理数据时候想要做除法计算,发现直接用$A/$B是行不通的,后来才发现linux做数学运算,需要调用bc命令,查了以下其用法,简单记录如下

  一、四则运算,取余,乘方。

  加 +

  减 -

  乘 *

  除 /

  取余 %

  乘方 ^

  调用格式,现在为止发现有两种调用格式可用:

  1、

  ################################

  a=`bc -l << END

  scale=30

  5/4

  END`

  ################################

  b=`echo 'scale=30;5/4'|bc -l`

  ################################

  echo $a

  echo $b

  两种方式是等价的,后面的

  echo $a

  echo $b

  可以来查看是否给变量赋值成功,其中上面scale=30的意思是小数点后保留30位。

  而且可以看到上面格式中用来分割不同表达式使用了“回车”或者“;”,那么两种方式也是等价的,随便自己喜欢用哪种。

  -l是什么意思呢?是bc的一个可选选项

  bc命令除了可以做简单的上述运算之外,还可以做其他一些事情,有时候需要加上选项。

  那么选项及其功用如下:

  Options

  -h, --help 显示bc的help信息,不进入bc命令行

  Print help message and exit.

  -i, --interactive 不知道啥作用

  Interactive mode.

  -l, --mathlib 启用带有数学库的bc,进入bc命令行

  Make functions from the math library available.

  -s, --standard 不知道POSIX啥意思

  Ignore all extensions, and process exactly as in POSIX.

  -w, --warn 不知道POSIX啥意思

  When extensions to POSIX bc are used, print a warning.

  -q, --quiet 不显示版本信息,进入bc命令行

  Do not display welcome message.

  -v, --version 显示版本号,不进入bc命令行

  Print version number.

  进入bc命令行是什么意思呢?那就是,你可以直接在终端里敲一些简单的表达式来进行计算。

  若想退出bc命令行,那么可以用CTRL+D,或者输入“quit”以后再点回车。

  那么可以看到-l是调用数学库的意思,在进行运算时候如果加上-l选项,那么进行除法运算时候默认在小数点后保留20位,不加的话默认是不保留小数点后的部分的,如:

  b=`echo '5/4'|bc`

  echo $b

  你将看到的结果就会是1,而不是1.25000(省略很多0)

  但是这里需要注意一点很奇怪的现象,那就是加上-l选项,取余运算会变得很不正常,得不到正确结果,具体原因我也不清楚。所以如果想要做取余运算,那就不能加上-l选项。

  那么这个-l选项是跟我们做科学计算最相关的,所以查的比较多,其他选项我自己也没有去看去试。下面一个还是讲-l选项的功用

  二、调用一些简单数学函数:

  调用以下函数是必须加上-l选项的。

  s(angle) ——正弦,弧度制

  Compute the sine of angle, a constant or expression in radians.

  c(angle) ——余弦,弧度制

  Compute the cosine of angle, a constant or expression in radians.

  a(n) ——反正切,弧度制

  Compute the arctangent of n, returning an angle in radians.

  e(expr) ——e指数

  Compute e to the power of expr.

  l(expr) ——log以e为底对数

  Compute the natural log of expr.

  j(n, x) ——n阶贝塞尔函数

  Compute the Bessel function of integer order n.

  sqrt(expr) ——开根号

  Compute the square root of expression expr.

  length(expr) ——表达式的长度

  Compute how many significant digits are in expr.

  scale(expr) ——仅针对数字表达式,并且只获得小数点右面的长度

  Same as length, but count only digits to the right of the decimal point.

  那么对于最后一个scale需要有一些注意的地方,scale(30)跟scale=30表达的意思是完全不一样 的,scale=30是一种设置,而scale(30)是获取30小数点后的字符长度,所以scale(30)结果为0,scale(30.123)结果 为3

  所以综合以上所述我们可以这样简单理解:首先记住两种调用格式;对于科学计算,一般加上-l选项,而做取余运算时候,则不要加-l选项。

  三、bc可以进行数制转换

  当然调用格式仍然是上述格式,如将10进制的65535转换成16进制:

  a=`bc << END

  obase=16;ibase=10;65535

  END`

  echo $a

  结果为FFFF。所以可以看到输入进制为ibase,输出进制为obase。如果输入进制为16,那么使用ABCDEF时候得用大 写,不然会报错。当然这里你可以随便设置进制,13进制、17进制……随你喜欢,只要觉得有意义。如果设置的进制高于16进制的话,结果就不再用 ABCDEF来表示来,而是直接用数字表示。如

  a=`bc << END

  obase=32;ibase=10;65535

  END`

  echo $a

  结果为01 31 31 31。

  四、bc可以对文件进行处理

  比如我们新建一个文件,输入

  1+1

  1+2

  1+3

  2*3

  2/3

  2^3

  然后保存为 "text"。

  然后我们用在终端输入 bc text (当然你要在text的路径下,否则请加上完整的路径名称)

  然后就可以看到结果:

  2

  3

  4

  6

  0

  8

  可以看到2/3结果为0,上面已经分析了,如果加上选项-l,就会显示出正确结果:

  bc -l text :

  2

  3

  4

  6

  .66666666666666666666

  8

  五、利用bc还可以编辑函数,暂时我好像用不到,就先不说了。把大致用法贴下面,作为以后参考。

  define f(args) {

  Begin the definition of function f having the arguments args. The arguments are separated by commas. Statements follow on successive lines. End with }.

  auto x, y

  Set up x and y as variables local to a function definition, initialized to 0 and meaningless outside the function. Must appear first.

  return(expr)

  Pass the value of expression expr back to the program. Return 0 if (expr) is left off. Used in function definitions.



原文地址:http://user.qzone.qq.com/84233326/blog/1275980354

posted on 2013-01-12 09:55  keep_simple  阅读(2717)  评论(0)    收藏  举报