如何将浮动数转换为另一个浮点数的幂?

时间:2011-10-20 18:52:33

标签: 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编码并获得浮点结果?

4 个答案:

答案 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(很明显))。

我希望这会有所帮助。