天天看點

LINUX任意精度電腦BC用法

【用途說明】

Bash内置了對整數四則運算的支援,但是并不支援浮點運算,而bc指令可以很友善的進行浮點運算,當然整數運算也不再話下。手冊頁上說bc是An arbitrary precision calculator language,即一個任意精度的計算語言,注意是一種語言,它提供了一些文法結構,比如條件判斷、循環等,可以說是很強大的,但是我在實際中還沒有找到需要這個用途的場合 。另外一個用途就是用來進行進制轉換。

【常用參數】

一般情況下,我們使用不帶任何參數的bc指令:

bc

如果需要bc不輸出提示資訊,可以加上-q參數:

bc -q

如果要使用強大的數學庫,比如計算三角函數,需要加上-l參數:

bc -l

因為bc本身是一個指令解釋器,要退出它隻要直接輸入quit回車或者按Ctrl+D終止。

【使用示例】

示例一 指令行方式使用bc

[[email protected] 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

scale=2;3/4      # 保留小數點精度隻對除法、取餘、乘幂有效

.75

3/4

.75

3%4

scale=0

3%4

3

3^4

81

Ctrl+D

[[email protected] centos39]#

示例二 通過管道使用bc來計算

[[email protected] centos39]# echo 3 * 4 | bc

(standard_in) 1: parse error

[[email protected] centos39]# echo "3 * 4" | bc

12

[[email protected] centos39]# echo "scale=7; 355/113" | bc

3.1415929

[[email protected] centos39]#

這種方式下還可以用于浮點資料類型的大小比較:

a=1.2

b=3.2

c=`echo "$a < $b" | bc`

echo "$c"

以上腳本執行結果是1,而如果比較的結果是不滿足的(比如将上面的$a < $b改為$a > $b),輸出結果就是0。

注意:這裡一定一定要注意的是,這個比較結果就是0或1,而不是代表true或false,因而不能用于if後的條件判斷!切記切記!

示例三 進制轉換

[[email protected] ~]# echo "ibase=16; FFFF" | bc

65535

[[email protected] ~]# echo "obase=16; 1000" | bc

3E8

[[email protected] ~]#

我們用到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進制。

示例四 将多個表達式寫在一個檔案中一起計算

[[email protected] ~]# cat test.bc

123*321

123/321

scale=4;123/321

[[email protected] ~]# 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

.3831

Ctrl+D

[[email protected] ~]#

[[email protected] ~]# cat test.bc | bc

39483

.3831

[[email protected] ~]#

示例五 一個計算三角形面積的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" 

[[email protected] academic]# ./area_of_triangle.sh

Enter base of a triangle : 123

Enter height of a triangle : 321

Area of a triangle is 19741.50

[[email protected] 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 

将以上代碼粘貼到終端。

[[email protected] ~]# # usage: calc_sum <num1> <num2>

[[email protected] ~]# # 計算兩個數的和

[[email protected] ~]# calc_sum()

> {

> bc -q <<EOF

> $1+$2

> EOF

> }

[[email protected] ~]#

[[email protected] ~]# # usage: calc_free <count>

[[email protected] ~]# # 計算費用,單價0.05元

[[email protected] ~]# calc_fee()

> {

> bc -q <<EOF

> 0.05*$1

> EOF

> }

[[email protected] ~]#

[[email protected] ~]#

[[email protected] ~]# calc_sum 123 321

444

[[email protected] ~]# calc_fee 1000

50.00

[[email protected] ~]#

示例七 使用數學庫

有文章稱可以計算100位的圓周率pi值。

[[email protected] ~]# echo "scale=100; a(1)*4" | bc

Runtime error (func=(main), adr=11): Function a not defined.

[[email protected] ~]# echo "scale=100; a(1)*4" | bc -l

3.141592653589793238462643383279502884197169399375105820974944592307\

8164062862089986280348253421170676

[[email protected] ~]#

繼續閱讀