通过top命令看到的进程的CPU、内存的使用率的百分比是一个浮点数,我需要在写脚本时对其进行处理,所以学习了一些,总结如下。
其实,Shell(这里是Bash)本身不具备处理浮点计算的能力,但是可以使用“bc”这个高精度的计算器工具来帮助,另外,也可以在Bash中调用“awk”脚本来处理浮点运算。
1. 用bc来处理计算(包括整型和浮点计算)
bc – An arbitrary precision calculator language
(1). 通常在Bash脚本中使用bc的范例格式为:
variable=$(echo “OPTIONS; OPERATIONS” | bc [options]) 即:echo “[选项];操作” | bc [选项]
(2). 在下面的脚本中,提到在第一个选项中,“scale”变量表示输出中小数点后的精度,可以用于控制计算结果的精度;“ibase”和“obase”分别表示输入和输出数据的进制,可以用于数值进制的转换。
(3). 浮点数的比较,如“if [ $(echo "$big > $small" | bc) -eq 1 ]”,将一个逻辑判断式用管道传给bc。如果结果为真则输出1,否则输出0,然后就可以利用这个结果进行进一步的操作了。
(4). bc本来是用一个文件作为输入进行计算的(后面也有演示),所以可以将很复杂的计算写到文件中,然后让bc工具去处理到处计算结果。
注意一下:在使用除法运算符/时,要想保留小数,需要自己设置scale,否则默认时scale,小数点后时0位。
2. 使用awk来处理浮点计算和浮点数比较
不解释过多了,写了示例脚本如下,看懂了这个就会知道怎么处理浮点计算和浮点数比较了。
#!/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}}'
执行的结果如下:
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
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
对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?
我正试图在Linux中实现这一点 我面临着几个问题: 处理浮点数 比较(使用$vs不使用) 计算绝对值 我不能一次解决我的问题并处理所有这些问题。我已经搜索了很多很多页面,有些解决方案不适合我。例如,我似乎没有腹肌功能。 任何帮助都将不胜感激。
问题内容: 我想比较PHP中的两个浮点数,如以下示例代码所示: 在此代码中,即使和相同,它也返回条件的结果而不是条件。有没有什么特殊的方法来处理/比较PHP中的浮点数? 如果是,那么请帮助我解决此问题。 还是我的服务器配置有问题? 问题答案: 如果您这样做,它们 应该 是相同的。但是请注意,浮点值的一个特征是 看起来 可以导致相同值的计算实际上不必相同。因此,如果是一个文字并通过计算到达该文字,则
此代码给出输出ELSE 此代码给出的输出是: 虽然两个程序看起来都一样,但为什么输出有差异呢?为什么会这样?
问题内容: 我刚刚阅读了有关浮点值比较的声明 不得使用==或!=运算符比较浮点值。大多数浮点值没有精确的二进制表示形式,并且精度有限。 如果是这样,比较两个浮点值的最佳方法是什么? 问题答案: 以下扩展方法对于实现Kevin的建议可能有用: 现在,您可以执行以下操作: 只需将更改为更合适的名称,或在需要时将默认边距更改为比更好的值。
问题内容: 我对在Go中精确减去2个float的方法感兴趣。 我尝试使用该 库,但无法获得准确的结果。 我使用Javascript中的big.js库解决了此问题。Go算法是否有类似的库/方法? https://play.golang.org/p/vomAr87Xln 问题答案: 包装大 导入“数学/大” func(* Float)字符串 字符串格式x类似于x.Text(’g’,10)。(必须显式调