灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3294回复:0

Linux命令之bc - 浮点计算器、进制转换

楼主#
更多 发布于:2012-02-01 16:15
用途说明
 Bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。手册页上说bc是An arbitrary precision calculator language,即一个任意精度的计算语言,注意是一种语言,它提供了一些语法结构,比如条件判断、循环等,可以说是很强大的,但是我在实际中还没有找到需要这个用途的场合 。另外一个用途就是用来进行进制转换。
 常用参数
 一般情况下,我们使用不带任何参数的bc命令。
 bc
 如果需要bc不输出提示信息,可以加上-q参数:
 bc -q
 如果要使用强大的数学库,比如计算三角函数,需要加上-l参数:
 bc -l
 因为bc本身是一个命令解释器,要退出它只要直接输入quit回车或者按Ctrl+D终止。
 使用示例
 示例一 命令行方式使用bc
 [root@localhost centos39]# bc
 bc 1.06
 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
 This is free software with ABSOLUTELY NO WARRANTY.
 For details type `warranty'.
 3+4
 7
 3-4
 -1
 3*4
 12
 3/4
 0
 scale=2;3/4      # 保留小数点精度只对除法、取余、乘幂有效
 .75
 3/4
 .75
 3%4
 0
 scale=0
 3%4
 3
 3^4
 81
 Ctrl+D
 [root@localhost centos39]#
 示例二 通过管道使用bc来计算
 [root@localhost centos39]# echo 3 * 4 | bc
 (standard_in) 1: parse error
 [root@localhost centos39]# echo "3 * 4" | bc
 12
 [root@localhost centos39]# echo "scale=7; 355/113" | bc
 3.1415929
 [root@localhost centos39]#
 示例三 进制转换
 [root@rhel55 ~]# echo "ibase=16; FFFF" | bc
 65535
 [root@rhel55 ~]# echo "obase=16; 1000" | bc
 3E8
 [root@rhel55 ~]#
  
  
 我们用到bc的ibase和obase方法。
  
   ibase是输入数字的进制,而obase就是输出数字的进制了。很好记,i是input,o是output。
  
   如果用一条命令来转数字,可以用echo命令和管道结合bc。如下:
  
   10进制转2进制:
  
   $ echo "obase=2;ibase=10;100" | bc1100100
  
   10进制转16进制:
  
   $ echo "obase=16;ibase=10;100" | bc64
  
   16进制转10进制:
  
   $ echo "ibase=16;obase=2;F1" | bc11110001
  
   注意,16进制数字的F要大写,如果小写结果是不对的。像最上面没有指定的时候,默认是10进制。
 示例四 将多个表达式写在一个文件中一起计算
 [root@rhel55 ~]# cat test.bc
 123*321
 123/321
 scale=4;123/321
  
 [root@rhel55 ~]# bc test.bc
 bc 1.06
 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
 This is free software with ABSOLUTELY NO WARRANTY.
 For details type `warranty'.
 39483
 0
 .3831
 Ctrl+D
 [root@rhel55 ~]#
 [root@rhel55 ~]# cat test.bc | bc
 39483
 0
 .3831
 [root@rhel55 ~]#
 示例五 一个计算三角形面积的Bash脚本
 先复习一下初中的知识:b表示三角形的底,h表示三角形的高,那么三角形的面积计算公式是b*h/2 。
  
 文件 :area_of_triangle.sh
 Bash代码
 #!/bin/bash
  
 # Shell program/script to read the base and height of a traingle and find its area
 # -------------------------------------------------------------------------
 # Copyright (c) 2005 nixCraft project <http://cyberciti.biz/fb/>
 # This script is licensed under GNU GPL version 2.0 or above
 # -------------------------------------------------------------------------
 # This script is part of nixCraft shell script collection (NSSC)
 # Visit http://bash.cyberciti.biz/ for more information.
 # -------------------------------------------------------------------------
 # Formula info: http://www.mste.uiuc.edu/dildine/heron/triarea.html
 # Area=(1/2) x Base x Height
  
 echo -n "Enter base of a triangle : "
 read b
  
 echo -n "Enter height of a triangle : "
 read h
  
 # calculate it and display back
 area=$(echo "scale=2;(1/2) * $b * $h"|bc)
 echo "Area of a triangle is $area"
  
  
 [root@smsgw academic]# ./area_of_triangle.sh
 Enter base of a triangle : 123
 Enter height of a triangle : 321
 Area of a triangle is 19741.50
 [root@smsgw academic]#
  示例六 使用bc命令的脚本片段
 Bash代码
 # usage: calc_sum <num1> <num2>
 # 计算两个数的和
 calc_sum()
 {
 bc -q <<EOF
 $1+$2
 EOF
 }
  
 # usage: calc_free <count>
 # 计算费用,单价0.05元
 calc_fee()
 {
 bc -q <<EOF
 0.05*$1
 EOF
 }
    
  
 将以上代码粘贴到终端。
 [root@web ~]# # usage: calc_sum <num1> <num2>
 [root@web ~]# # 计算两个数的和
 [root@web ~]# calc_sum()
 > {
 > bc -q <<EOF
 > $1+$2
 > EOF
 > }
 [root@web ~]#
 [root@web ~]# # usage: calc_free <count>
 [root@web ~]# # 计算费用,单价0.05元
 [root@web ~]# calc_fee()
 > {
 > bc -q <<EOF
 > 0.05*$1
 > EOF
 > }
 [root@web ~]#
 [root@web ~]#
 [root@web ~]# calc_sum 123 321
 444
 [root@web ~]# calc_fee 1000
 50.00
 [root@web ~]#
 示例七 使用数学库
 有文章称可以计算100位的圆周率pi值。
 [root@web ~]# echo "scale=100; a(1)*4" | bc
 Runtime error (func=(main), adr=11): Function a not defined.
 [root@web ~]# echo "scale=100; a(1)*4" | bc -l
 3.141592653589793238462643383279502884197169399375105820974944592307
 8164062862089986280348253421170676
 [root@web ~]#


喜欢0 评分0
游客

返回顶部