我试图找出如何在bash中计算涉及括号和指数的数学表达式。随意使用sed,awk,perl,bash提供解决方案
例如
i=0.0545
j=360
(1+ $i * 2.43 / 100.0) ^ ($j/940) -1
你如何用bash编码并获得浮点结果?
答案 0 :(得分:2)
要计算 x ^ n ,请使用:
bc -l <<< "e($n*l($x))"
或
echo "e($n*l($x))" | bc -l
理论
bc
命令不处理使用浮点指数的幂运算。但是,它具有指数e()
和对数l()
函数。使用这两个函数,我们可以通过属性 x ^ n = exp(log(x ^ n))= exp(n * log(x))来计算幂。
答案 1 :(得分:1)
当我需要精度时,我使用bc
进行数学运算(但在这种情况下不起作用,因为它不支持小数指数):
echo "scale = 10; 1 / 3" | bc
最简单的方法是使用awk
:
$ echo "" | awk 'END {print (1+ 2.43/100.0) ^ (360/940) - 1}'
0.00923751
如果你不这么想,你可能需要:
答案 2 :(得分:1)
这是perl:
$ x=`perl -e 'print (1 + $ARGV[0] * 2.43 / 100.) ** ($ARGV[1] / 940.0) - 1' 0.0545 360.0`
$ echo $x
1.00132435
答案 3 :(得分:1)
(您可能希望编辑帖子以包含您期望的表达方式的正确答案; - )
使用awk。它需要一个预期浮点计算的线索,因此更改任何整数表达式部分以包含尾随.0
(如下所示)。
i=0.0545 j=360
awk 'BEGIN {
print "i=" '$i' "\tj=" '$j' "\texpr="(1.0+ '$i' * 2.43 / 100.0) ^ ('$j'/940.0) -1.0
}' /dev/null
# output
i=0.0545 j=360 expr=0.000506991
更好的是,将BEGIN更改为END并使用awk cmd-line var赋值,即
awk 'END{
print "i=" i "\tj=" j "\texpr="(1.0+ i * 2.43 / 100.0) ^ (j/940.0) -1.0
}' i=0.0545 j=360 /dev/null
#output
i=0.0545 j=360 expr=0.000506991
(我想我最近读过BEGIN不会处理cmd行上的赋值,但它确实可以用END(很明显))。
我希望这会有所帮助。