我使用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正确执行这些计算?
答案 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^b
,ln(x) = ln(a^b) = b(ln(a))
,我们可以看到x = exp(b(ln(a)))
,所以如果你想将事情提升到小数b
,你可以用那个。
注意:在bc
中,实际的exp和ln函数是e和l。