佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Shell腳本處理浮點(diǎn)數(shù)的運(yùn)算和比較實(shí)例

Shell腳本處理浮點(diǎn)數(shù)的運(yùn)算和比較實(shí)例

熱門標(biāo)簽:服務(wù)外包 鐵路電話系統(tǒng) 呼叫中心市場(chǎng)需求 Linux服務(wù)器 網(wǎng)站排名優(yōu)化 地方門戶網(wǎng)站 AI電銷 百度競(jìng)價(jià)排名

通過(guò)top命令看到的進(jìn)程的CPU、內(nèi)存的使用率的百分比是一個(gè)浮點(diǎn)數(shù),我需要在寫腳本時(shí)對(duì)其進(jìn)行處理,所以學(xué)習(xí)了一些,總結(jié)如下。

其實(shí),Shell(這里是Bash)本身不具備處理浮點(diǎn)計(jì)算的能力,但是可以使用“bc”這個(gè)高精度的計(jì)算器工具來(lái)幫助,另外,也可以在Bash中調(diào)用“awk”腳本來(lái)處理浮點(diǎn)運(yùn)算。

1. 用bc來(lái)處理計(jì)算(包括整型和浮點(diǎn)計(jì)算)

bc – An arbitrary precision calculator language
(1). 通常在Bash腳本中使用bc的范例格式為:
variable=$(echo “OPTIONS; OPERATIONS” | bc [options]) 即:echo “[選項(xiàng)];操作” | bc [選項(xiàng)]
(2). 在下面的腳本中,提到在第一個(gè)選項(xiàng)中,“scale”變量表示輸出中小數(shù)點(diǎn)后的精度,可以用于控制計(jì)算結(jié)果的精度;“ibase”和“obase”分別表示輸入和輸出數(shù)據(jù)的進(jìn)制,可以用于數(shù)值進(jìn)制的轉(zhuǎn)換。
(3). 浮點(diǎn)數(shù)的比較,如“if [ $(echo "$big > $small" | bc) -eq 1 ]”,將一個(gè)邏輯判斷式用管道傳給bc。如果結(jié)果為真則輸出1,否則輸出0,然后就可以利用這個(gè)結(jié)果進(jìn)行進(jìn)一步的操作了。
(4). bc本來(lái)是用一個(gè)文件作為輸入進(jìn)行計(jì)算的(后面也有演示),所以可以將很復(fù)雜的計(jì)算寫到文件中,然后讓bc工具去處理到處計(jì)算結(jié)果。
注意一下:在使用除法運(yùn)算符/時(shí),要想保留小數(shù),需要自己設(shè)置scale,否則默認(rèn)時(shí)scale,小數(shù)點(diǎn)后時(shí)0位。

2. 使用awk來(lái)處理浮點(diǎn)計(jì)算和浮點(diǎn)數(shù)比較

不解釋過(guò)多了,寫了示例腳本如下,看懂了這個(gè)就會(huì)知道怎么處理浮點(diǎn)計(jì)算和浮點(diǎn)數(shù)比較了。

復(fù)制代碼 代碼如下:

#!/bin/bash
# author: Jay smile665@gmail.com>
# some examples for playing with floating point number.

# basic usage of 'bc' tool in Bash.
a=3.33
b=3.3
c=$(echo "$a + $b" | bc)
d=$(echo "$a * $b" | bc)
e=$(echo "scale=5; $a / $b" | bc)
echo "c=a+b=$a+$b=$c"
echo "d=a*b=$a*$b=$d"
echo "e=a/b=$a/$b=$e"

# "-l" parameter for 'bc' means using math library.
pi=$(echo "scale=10; 4*a(1)" | bc -l)
s=$(echo "s($pi/6)" | bc -l)
echo "pi=$pi"
echo "s=sin(pi/6)=$s"

# use more options of 'bc' tool
r=$(echo 'ibase=10;obase=2; 15+16' | bc)
echo "binary of (15+16) is $r"

# comparison for floating point numbers using 'bc'
big=100
small=99.9
if [ $(echo "$big > $small" | bc) -eq 1 ]; then
        echo "$big is bigger than $small"
fi

# deal with floating point numbers with 'awk' language
echo $(awk -v x=10 -v y=2.5 'BEGIN {printf "10/2.5=%.2f\n",x/y}')
v=$(echo $big $small | awk '{ printf "%0.8f\n" ,$1/$2}')
echo "$big / $small = $v"

echo $big $small | awk '{if($1>$2) {printf"%f > %f\n",$1,$2} else {printf"%f %f\n",$1,$2}}'

執(zhí)行的結(jié)果如下:

復(fù)制代碼 代碼如下:

master@jay-linux:~/workspace/mygit/shell/sh2012$ ./floating-point.sh
c=a+b=3.33+3.3=6.63
d=a*b=3.33*3.3=10.98
e=a/b=3.33/3.3=1.00909
pi=3.1415926532
s=sin(pi/6)=.49999999994373819220
binary of (15+16) is 11111
100 is bigger than 99.9
10/2.5=4.00
100 / 99.9 = 1.00100100
100.000000 > 99.900000

另外,bc處理一個(gè)文件中的計(jì)算邏輯,演示如下:

復(fù)制代碼 代碼如下:

master@jay-linux:~/workspace/mygit/shell/sh2012$ cat temp.bc
3+8
3/8
scale=2; 3/8

master@jay-linux:~/workspace/mygit/shell/sh2012$ bc -q temp.bc
11
0
.37

bc是強(qiáng)大的工具,請(qǐng)“man bc”查看詳情;同樣,請(qǐng)“man awk”。

 

您可能感興趣的文章:
  • python讀取浮點(diǎn)數(shù)和讀取文本文件示例
  • js浮點(diǎn)數(shù)保留兩位小數(shù)點(diǎn)示例代碼(四舍五入)
  • 正負(fù)小數(shù)點(diǎn)后兩位浮點(diǎn)數(shù)實(shí)現(xiàn)原理及代碼
  • 基于C++浮點(diǎn)數(shù)(float、double)類型數(shù)據(jù)比較與轉(zhuǎn)換的詳解
  • PHP數(shù)據(jù)類型之整數(shù)類型、浮點(diǎn)數(shù)的介紹

標(biāo)簽:湘潭 湖南 黃山 銅川 仙桃 蘭州 衡水 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Shell腳本處理浮點(diǎn)數(shù)的運(yùn)算和比較實(shí)例》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    乐清市| 且末县| 烟台市| 丹凤县| 乃东县| 隆子县| 新野县| 阜宁县| 新龙县| 南康市| 土默特右旗| 天峻县| 开阳县| 阿城市| 开平市| 太白县| 东光县| 福清市| 西林县| 科尔| 兴和县| 万载县| 浏阳市| 余庆县| 松潘县| 公安县| 临海市| 浮山县| 偏关县| 镇安县| 巴林右旗| 鞍山市| 思南县| 苍南县| 盈江县| 栖霞市| 应用必备| 蒲江县| 巧家县| 个旧市| 商南县|