如何在 Bash 中求幂

Posted

技术标签:

【中文标题】如何在 Bash 中求幂【英文标题】:How to do exponentiation in Bash 【发布时间】:2011-04-22 18:30:53 【问题描述】:

我试过了

echo 10**2

打印10**2。如何计算正确的结果,100?

【问题讨论】:

【参考方案1】:

您可以使用let builtin:

let var=10**2   # sets var to 100.
echo $var       # prints 100

或arithmetic expansion:

var=$((10**2))  # sets var to 100.

算术扩展的优点是允许您执行shell arithmetic,然后只使用表达式而不将其存储在变量中:

echo $((10**2)) # prints 100.

对于较大的数字,您可能希望将 exponentiation operator 的 external command bc 用作:

bash:$ echo 2^100 | bc
1267650600228229401496703205376

如果您想将上述结果存储在一个变量中,您可以通过$() 语法使用command substitution:

var=$(echo 2^100 | bc)

或旧的反引号语法:

var=`echo 2^100 | bc`

请注意,命令替换与算术扩展不同:

$(( )) # arithmetic expansion
$( )   # command substitution

【讨论】:

也可以使用$[ ... ] 代替$(( ... ))。我发现后者在视觉上更吸引人,但这只是我的口味。不过不知道这两者有没有区别。看起来他们的行为是一样的。 Alberto:所有这些括号、let 和 $ 都是必需的,因为 bash 作为一个简单的命令行解释器,最好假设所有内容都是字符串并且应该这样处理,除非另有明确说明。致敬! @DarkDust $[...] 是一种较旧的已弃用语法。 unix.stackexchange.com/questions/209833/… 注意: $(( ... )) 不起作用。相反,必须使用$( ... )。请参阅下面的@firefly 的answer。 @WrichikBasu 我提交了编辑;现在已经修好了。【参考方案2】:

各种方式:

Bash

echo $((10**2))

Awk

awk 'BEGINprint 10^2'  # POSIX standard
awk 'BEGINprint 10**2' # GNU awk extension

bc

echo '10 ^ 2' | bc

dc

dc -e '10 2 ^ p'

【讨论】:

【参考方案3】:

实际上 var=$((echo 2^100 | bc)) 不起作用 - bash 正在尝试在 (()) 中进行数学运算。但是一个 而是有命令行序列,因此会产生错误

var=$(echo 2^100 | bc) 的作用是值是在里面执行的命令行的结果 ()

【讨论】:

这很有帮助你应该把它作为对上面答案的评论。 不错,顺便说一句;另一个接受的命令遵循$((...)) 模式(Double Parentheses Construct,来源 Advanced Bash-Scripting Guide,“允许算术扩展和评估”)。在这里,正如您所指出的,我们需要命令替换,即 $(...) 构造。 ABS 指南notes,“$(...) 已取代反引号”。 Bash 初学者指南,section 3.4.5-6,都在旁边进行了描述。

以上是关于如何在 Bash 中求幂的主要内容,如果未能解决你的问题,请参考以下文章

矩阵如何求幂?

如何在python中求曲线的斜率?

使用矩阵求幂的线性递归[关闭]

如何在mathematica 5.0 中求曲线在某个区间的最大值和最小值和某点的斜率?

如何在C语言编程中求取三个数中的最大值

使用求幂**0.5 比 math.sqrt 效率低?