【发布时间】:2011-10-20 18:52:33
【问题描述】:
我试图弄清楚如何在 bash 中计算涉及括号和指数的数学表达式。随意提供使用 sed、awk、perl、bash 的解决方案
例如
i=0.0545
j=360
(1+ $i * 2.43 / 100.0) ^ ($j/940) -1
您将如何在 bash 中编码并获得浮点结果?
【问题讨论】:
标签: bash shell scripting sed awk
我试图弄清楚如何在 bash 中计算涉及括号和指数的数学表达式。随意提供使用 sed、awk、perl、bash 的解决方案
例如
i=0.0545
j=360
(1+ $i * 2.43 / 100.0) ^ ($j/940) -1
您将如何在 bash 中编码并获得浮点结果?
【问题讨论】:
标签: bash shell scripting sed awk
要计算 x^n,请使用:
bc -l <<< "e($n*l($x))"
或
echo "e($n*l($x))" | bc -l
理论
bccommand 不处理使用浮点指数的幂运算。但是,它具有指数函数 e() 和对数函数 l()。使用这两个函数,我们可以通过属性x^n = exp(log(x^n)) = exp(n*log(x))计算幂。
【讨论】:
在 perl 中:
$ x=`perl -e 'print (1 + $ARGV[0] * 2.43 / 100.) ** ($ARGV[1] / 940.0) - 1' 0.0545 360.0`
$ echo $x
1.00132435
【讨论】:
--放在perl脚本的结尾和参数之间:perl -e 'print (1 + $ARGV[0] * 2.43 / 100.) ** ($ARGV[1] / 940.0) - 1' -- -0.0545 360
当我需要精度时,我使用bc 进行数学运算(但在这种情况下不起作用,因为它不支持小数指数):
echo "scale = 10; 1 / 3" | bc
最简单的方法是使用awk:
$ echo "" | awk 'END {print (1+ 2.43/100.0) ^ (360/940) - 1}'
0.00923751
如果你不怎么 awk,你可能需要:
【讨论】:
bc 支持分数指数,你只需要记住a^b = exp(b * log(a))。您可以使用bc -l 和define fpow(a, b) { return e(b * l(a)); } 来实现。
(您可能需要编辑您的帖子以包含您期望的正确答案作为您的表达的正确答案;-)
使用 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 assignment,即
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 一起使用(显然)。
我希望这会有所帮助。
【讨论】: