【问题标题】:Using fractional exponent with bc使用带 bc 的小数指数
【发布时间】:2013-04-16 09:45:25
【问题描述】:

bc,Linux命令行计算器,精通计算

3^2
9

即使是负指数也不会混淆它:

3^-2
0.11111

然而遇到却失败了

9^0.5
Runtime warning (func=(main), adr=8): non-zero scale in exponent

bc怎么可能处理不了?

错误信息是什么意思?


是的,我已经阅读了this 以及那里给出的解决方案:

e(0.5*l(9))
2.99999999999999999998

是的,这是不好的,因为精度损失和

计算器应该解决表达式。你不应该 让计算器的生活更轻松,它应该是另一个 一路走来……


功能旨在鼓励用户编写自己的函数。使其成为一个独特的计算器,需要用户定义的函数来计算平方根。

为切线或余切函数编写函数并不困扰我,因为考虑到s(x)c(x),它看起来非常简单。但在我看来,通过用户定义的函数计算平方根有点过分了。

如果有 Python,为什么有人使用 bc?速度?

【问题讨论】:

  • expr ^ expr 的第二个参数必须是整数(scale=0)。但是 0.5 的 scale = 1。
  • 注意bc已经有一个原生的平方根函数:scale=5; sqrt(9)
  • 如果你没有绑定到 bc,你可以使用Genius 作为替代。它支持开箱即用的有理指数:genius --exec='81^0.75'
  • “因为精度损失不好”,是的,如果你说:scale=3;并运行 e(0.5*l(9)) 你得到:2.97 甚至更糟......我预计最后会发生舍入,但这是错误的。

标签: exponent sqrt bc


【解决方案1】:

在bc中,b必须是a^b中的整数。但是,您可以像这样将自己的函数添加到 bc:

创建一个文件~/.bcrc,添加如下函数:

define pow(a, b) {
    if (scale(b) == 0) {
        return a ^ b;
    }
    return e(b*l(a));
}

那么你可以按如下方式启动bc:

bc ~/.bcrc -l

所以你可以使用函数 pow 来做这样的计算。

查看更多here,可以为bc添加更多功能。

【讨论】:

  • 这个实现在pow(32, 0.2)的情况下会有精度损失
【解决方案2】:

bc 是非常基本的,“数学扩展”没有提供的更复杂的功能必须在语言本身中实现:它有你需要做的一切;特别是“权力”是一个常见的例子,即使在wikipedia 上也是如此。

但您可能也有兴趣阅读例如 this answer 此处的 SO。

【讨论】:

  • 我会同意这一点,因为那里没有'power'功能。它可以完美地计算3^2 甚至3^-2。然而,当请求像平方根这样简单的函数时,它会以无法破译的错误消息来回答。
  • 它没有幂函数:它有整数幂函数。当我在我现在可以使用的 bc 中要求 9^0.11 时出现的错误是“exp not an integer”,这使得它更清楚。但是“非零刻度”的含义完全相同,因为您使用 scale=0 表示 bc 您想要“整数精度”(没有十进制数)。
  • “它没有幂函数:它具有整数幂函数”没有意义。 bc 中的每个其他函数都接受小数参数。为什么要为如此广泛使用的功能破例?
  • 您所说的其他功能可以被认为是特殊的(如果您省略-l 开关,您将没有它们)。关于“幂”,“基本”是 X^N 是 X 重复 N 次,因此 N 必须是整数才能使这种解释起作用。将其扩展到实指数并非易事。为什么-l 不能“增强”^?或者没有 pow func 与 sqrt, s, c, ...?这些都是其他类型的问题。 en.wikipedia.org/wiki/Exponentiation
  • 是的,这是有道理的。但是“基本”的含义是从 ​​bc author 的角度给出的,而不是从 bc user 的角度给出的。我不太确定除了作者之外谁需要这种区别。事实上,我完全不理解-l 的含义。一些向后兼容性问题?没有-l的bc有什么用例吗?
猜你喜欢
  • 2013-02-15
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多