无法在bc中进行复杂的计算

时间:2015-01-19 21:54:41

标签: bash bc

我使用qalculate作为我的日常计算器,它太棒了!输入类似的内容很容易:

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

并得到正确答案:

1.320289

但是试图让bc在bash脚本中进行这种计算是令人沮丧的。谷歌搜索回吐了许多页面,展示了使用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正确执行这些计算?

2 个答案:

答案 0 :(得分:3)

不幸的是,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

答案 1 :(得分:2)

来自bc手册页:

  

expr ^ expr:                 表达式的结果是第一个引发的值                 第二。第二个表达式必须是整数。

但是,如果x = a^bln(x) = ln(a^b) = b(ln(a)),我们可以看到x = exp(b(ln(a))),所以如果你想将事情提升到小数b,你可以用那个。

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