【问题标题】:How to take a float to a power of another float number?如何将浮点数乘以另一个浮点数的幂?
【发布时间】: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


    【解决方案1】:

    要计算 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))计算幂。

    【讨论】:

      【解决方案2】:

      在 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 -e 'print (1 + $ARGV[0] * 2.43 / 100.) ** ($ARGV[1] / 940.0) - 1 ' -0.0545 360 结果:无法识别的开关 -0.0545*(-h 将显示有价值的选项)。
      • --放在perl脚本的结尾和参数之间:perl -e 'print (1 + $ARGV[0] * 2.43 / 100.) ** ($ARGV[1] / 940.0) - 1' -- -0.0545 360
      • 双破折号表示其余参数应按字面意思理解。否则,带有破折号的参数被视为一个标志(并且其前导破折号被剥离),并且下一个参数被视为前一个标志的参数。在这种情况下,您希望将最后两个参数视为可能带有负号的数字(不是破折号!相同的 ascii 字符,不同的语义含义)。
      【解决方案3】:

      当我需要精度时,我使用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 -ldefine fpow(a, b) { return e(b * l(a)); } 来实现。
      • 整洁的把戏.. 谢谢。表明在数学课上集中注意力会有所帮助.. :)
      【解决方案4】:

      (您可能需要编辑您的帖子以包含您期望的正确答案作为您的表达的正确答案;-)

      使用 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 一起使用(显然)。

      我希望这会有所帮助。

      【讨论】:

      • 如何从 awk 函数外部传递 i 和 j?
      • 查看修订版。祝你好运。
      • 参见修订 #2。此外,有趣的是,我们为您的表达得到了 3 个不同的答案。您期望的数字是多少,或者...? :-) 祝你好运。
      猜你喜欢
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 2017-10-28
      相关资源
      最近更新 更多