无法在 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。
我使用 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。