Bash 无法使复杂的计算在bc中工作

Bash 无法使复杂的计算在bc中工作,bash,bc,Bash,Bc,我使用QalCalculate作为我的日常计算器,它很棒!输入以下内容很容易: (1+10^(-17.2/20)) / (1-10^(-17.2/20)) 并得到正确的答案: 1.320289 但是试图让bc在bash脚本中进行这种计算是令人沮丧的。谷歌搜索(Google search)在很多页面上展示了使用bc的最简单的数学示例,但我还没有找到任何页面解决如何执行更复杂的计算。当我在CL处键入以下内容时: echo 'scale=50; (1+10^(-17.2/20)) / (1-10^

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

(1+10^(-17.2/20)) / (1-10^(-17.2/20))
并得到正确的答案:

1.320289
但是试图让bc在bash脚本中进行这种计算是令人沮丧的。谷歌搜索(Google search)在很多页面上展示了使用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
不支持指数,如
-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: 表达式的结果是第一个提升到的值 第二个。第二个表达式必须是整数

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


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

来自
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。

产生:
echo'a=10;b=-17.2/20;x=e(b*l(a));(1+x)/(1-x)|bc-l
我确信bc要求输入其计算的方式有非常有效的理由,但与下面提供的
awk
解决方案相比,bc输入计算的方式不可读或感觉非常直观,而是不透明和笨拙。一个已经很复杂的计算变得更加困难。除非在复杂的计算中使用
awk
有任何严重的缺点,否则它看起来像是两者之间的胜利者。@scriptz bc的优点是它可以任意精确。如果您不需要,那么
awk
解决方案可能更为优越;b=-17.2/20;x=e(b*l(a));(1+x)/(1-x)|bc-l我确信bc要求输入其计算的方式有非常有效的理由,但与下面提供的
awk
解决方案相比,bc输入计算的方式不可读或感觉非常直观,而是不透明和笨拙。一个已经很复杂的计算变得更加困难。除非在复杂的计算中使用
awk
有任何严重的缺点,否则它看起来像是两者之间的胜利者。@scriptz bc的优点是它可以任意精确。如果您不需要,那么
awk
解决方案可能会更好。我需要做一些类似的事情:
awk-va=“$1”开始{print(1+10^(a/20))/(1-10^(a/20))}
来创建一个.bashrc别名,该别名使用用户在终端键入命令时提供的var$1值。然而,无论我以var$1的形式提供什么,它都只返回值
inf
。如果我能做到这一点,那么就不需要脚本来做同样的事情。在bash脚本中调用用户输入$1效果很好,但我仍然认为别名会更有效。@scriptz,您可以使用函数而不是别名:function test(){awk-va=$1-vb=$2'BEGIN{print(1+10^(a/b))/(1-10^(a/b));}我需要做类似于:
awk-va=“$1”的事情'BEGIN{print(1+10^(a/20))/(1-10^(a/20))}'
生成一个.bashrc别名,该别名在终端键入命令时使用用户提供的var$1值。然而,无论我以var$1的形式提供什么,它都只返回值
inf
。如果我能做到这一点,那么就不需要脚本来做同样的事情了。在bash脚本中调用用户输入$1效果很好,但我仍然认为别名会更有效。@scriptz,您可以使用函数而不是别名:function test(){awk-va=$1-vb=$2'BEGIN{print(1+10^(a/b))/(1-10^(a/b));}