如何计算一个浮点数的另一个浮点数的幂?

发布于 2024-12-11 05:30:00 字数 194 浏览 0 评论 0原文

我试图弄清楚如何在 bash 中计算涉及括号和指数的数学表达式。请随意提供使用 sed、awk、perl、bash 的解决方案,

例如

 i=0.0545
 j=360
 (1+ $i * 2.43 / 100.0) ^ ($j/940) -1

您将如何在 bash 中编码并获得浮点结果?

I am trying to figure out how compute a math expression involving parenthesis and exponents in bash. Feel free to offer solutions using sed, awk, perl, bash

for example

 i=0.0545
 j=360
 (1+ $i * 2.43 / 100.0) ^ ($j/940) -1

How would you encoded in bash and get the floating point result?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

燕归巢 2024-12-18 05:30:00

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

To calculate x^n use:

bc -l <<< "e($n*l($x))"

or

echo "e($n*l($x))" | bc -l

Theory

The bccommand doesn't deal with exponentiation using float exponents. However, it has the exponencial e() and the logarithmic l() functions. Using these two functions, we can calculate the exponentiation by the property x^n = exp(log(x^n)) = exp(n*log(x)).

随风而去 2024-12-18 05:30:00

这是用 perl 写的:

$ x=`perl -e 'print (1 + $ARGV[0] * 2.43 / 100.) ** ($ARGV[1] / 940.0) - 1' 0.0545 360.0`
$ echo $x
1.00132435

Here it is in perl:

$ x=`perl -e 'print (1 + $ARGV[0] * 2.43 / 100.) ** ($ARGV[1] / 940.0) - 1' 0.0545 360.0`
$ echo $x
1.00132435
不弃不离 2024-12-18 05:30:00

当我需要精度时,我使用 bc 进行数学计算(但在这种情况下不起作用,因为它不支持小数指数):

echo "scale = 10; 1 / 3" | bc

最简单的是使用 awk:

$ echo "" | awk 'END {print (1+ 2.43/100.0) ^ (360/940) - 1}'
0.00923751

如果你不太懂 awk,你可能需要:

I use bc for math when I need precision (but doesn't work in this case as it doesn't support fractional exponent):

echo "scale = 10; 1 / 3" | bc

Easiest is to go with awk:

$ echo "" | awk 'END {print (1+ 2.43/100.0) ^ (360/940) - 1}'
0.00923751

If you donno awk so much, you might need:

神爱温柔 2024-12-18 05:30:00

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

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

我希望这有帮助。

(You might want to edit your post to include what you expect as the correct answer for your expression ;-)

Use awk. It needs a clue that you are expecting floating point calcs, so change any whole number expression parts to include a trailing .0 (as below).

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

Better yet, change BEGIN to END and use awk cmd-line var assignment, i.e.

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

(I think I've read recently that BEGIN won't process assignments on the cmd line, but it does work with END (obviously)).

I hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文