无法在 bc 进行复杂的计算

cannot get complex calculation to work in bc

我使用 qalculate 作为我的日常计算器,它很棒!输入如下内容很容易:

(1+10^(-17.2/20)) / (1-10^(-17.2/20))

并得到正确答案:

1.320289

但是试图让 bc 在 bash 脚本中进行这种计算是令人沮丧的。 Google 搜索返回许多页面,展示了使用 bc 的最简单类型的简单数学示例,但我还没有找到任何页面解决如何执行更复杂的计算。当我在 CL 键入以下内容时:

echo 'scale=50; (1+10^(-17.2/20)) / (1-10^(-17.2/20))' | bc -l

我收到以下警告错误:

Runtime warning (func=(main), adr=25): non-zero scale in exponent
Runtime warning (func=(main), adr=44): non-zero scale in exponent
Runtime error (func=(main), adr=46): Divide by zero

如果我尝试类似但更简单的方法,例如:

echo '(1-10^(-17.2/20))' | bc -l

我确实得到了答案,但它是错误的,并且带有警告。

Runtime warning (func=(main), adr=18): non-zero scale in exponent
0

bc 在这里遇到了什么问题,或者更确切地说,我没有正确地做些什么来让 bc 正确地执行这些计算?

遗憾的是,bc 不支持 -17.2/20 等指数。如果您不需要 50 位小数的精度,一种选择是使用其他工具,例如 awk:

$ awk 'BEGIN{print (1+10^(-17.2/20)) / (1-10^(-17.2/20))}'
1.32029

您可以像这样从脚本中将变量传递给 awk:

$ awk -va="-17.2" -vb="20" 'BEGIN{print (1+10^(a/b)) / (1-10^(a/b))}'
1.32029

来自 bc 手册页:

expr ^ expr: The result of the expression is the value of the first raised to the second. The second expression must be an integer.

但是因为如果 x = a^b,那么 ln(x) = ln(a^b) = b(ln(a)),我们可以看到 x = exp(b(ln(a))),所以如果你想提高分数 b,你可以使用那。

注意:在bc中实际的exp和ln函数是e和l。