bc不支持对数和阶乘计算?

bc不支持对数和阶乘计算?

有没有其他命令行计算器支持log,n!计算?至少bc不能这样做,它产生了解析错误。

最好我可以在脚本中使用它,例如echo '5!' | program.

答案1

bc如果使用标志调用,则支持自然对数-l。您可以用它计算以 10 为底或以 2 为底的对数:

$ bc -l
...
l(100)/l(10)
2.00000000000000000000

l(256)/l(2)
8.00000000000000000007

我不认为有内置的阶乘,但是你自己编写就很容易:

$ bc
...
define fact_rec (n) { 
  if (n < 0) {
    print "oops";
    halt;
  }
  if (n < 2) return 1;
  return n*fact_rec(n-1);
}
fact_rec(5)
120

或者:

define fact_it (n) {
  if (n < 0) {
    print "oops";
    halt;
  }
  res = 1;
  for (; n > 1; n--) {
    res *= n;
  }
  return res;
}
fact_it(100)
93326215443944152681699238856266700490715968264381621468592963895217\
59999322991560894146397615651828625369792082722375825118521091686400\
0000000000000000000000

为了兼容 POSIX,你需要这样写:

define f(n) {
  auto s, m
  if (n <= 0) {
    "Invalid input: "
    n
    return(-1)
  }
  s = scale
  scale = 0
  m = n / 1
  scale = s
  if (n != m) {
    "Invalid input: "
    n
    return(-1)
  }
  if (n < 2) return(1)
  return(n * f(n - 1))
}

即:单字符函数名,no print, no halt, 中需要括号return(x)。如果您不需要输入验证(此处为正整数),则只需:

define f(n) {
  if (n < 2) return(1)
  return(n * f(n - 1))
}

答案2

奥皮计算器和命令行极客联合集的计算器。它模拟了经典的 HP RPN 计算器,这当然是唯一真正的计算方法。我们都知道

如果你是一个计算器异端,从小就使用 TI、Casios 等产品,那么这里有许多 RPN 教程在线您可以开始接受再教育。奥皮手册一旦你掌握了 RPN 的思考方式,最终会对你有所帮助。

计算 5!在 Orpie 中,只需按您的书写方式键入:5 !。您可以Enter在它们之间按一下以5先压入堆栈,但这不是必需的。

要计算 log 10 (5),请输入5 Enter ' l o Enter。在这种情况下,您必须先将 推5入堆栈,因为下一个击键不是运算符。该单引号字符进入命令缩写模式,您可以开始键入log10,您可以仅使用前两个字符来唯一标识它。 (相反l,单独获得自然对数函数ln。)

与任何 RPN 计算器一样,您可以得到真的与 Orpie 一起快速练习,并进行一些练习。

Orpie 位于 Ubuntu 库存存储库中。 FreeBSD 将其包含在 Ports 中,作为math/orpie.在 macOS 上,您可以通过以下方式安装它自制。第三方软件包可能适用于其他操作系统。从源代码构建可能有点麻烦,因为它是用奥卡米尔,并且您可能没有安装 OCaml 开发环境。不过,设置一套并不是特别困难。

答案3

总有 GNU八度、命令行计算器的 emacs(当您需要计算器内置完整的开发环境和编程语言以及数千个可选附加组件时)

或者如果你更喜欢统计数据。

我主要只是用来bc -l加载标准数学库...我什至已经bc别名为bc -l.有关定义阶乘函数的信息,请参阅 Mat 的答案......尽管bc手册页将其定义为:

define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}

如果您碰巧向其输入负数(应该是错误)或零(有效),则检查 <=1 而不是 == 1 可以防止无限循环。

答案4

完全是矫枉过正,但编程语言解释器毕竟是命令行计算器:

$ echo 5 | python -c 'import sys; import math; print math.factorial(int(sys.stdin.readline()));'
120

相关内容