公元前不支持对数和阶乘计算?


17

是否有任何其他的命令行计算器支持logn!计算?至少bc不能做到这一点,它告诉我解析错误

最好是我可以使用脚本,例如 echo '5!' | program

Answers:


20

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))
}

也就是说:中的单字符函数名称,不print,不halt,带括号return(x)。如果您不需要输入验证(此处为正整数),则只需:

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

1
如果为n == 1进行检查,则将其赋予负数或零将导致无限循环。使用n <= 1代替,如在bc手册页中。但是实际上,它应该返回负数错误-根据en.wikipedia.org/wiki/…,这是使用递归计算阶乘的已知问题。
cas

这并不意味着要研究阶乘的完美实现,而仅仅是一个简单的演示,以证明bc具有函数,包括递归函数。
2012年

是的,但是总有一天有人会阅读该示例函数并说“好极了,我想知道如何做到”并使用它。顺便说一句,我远不是成为一个数学极客,而且仍然是一个计算机极客...但是由于我正在纠正错误,所以我认为我最好先做一点研究:)
cas

好的,你去。正确的递归和迭代版本...
2012年

不太正确:0!=1,就像1!=1。至少,这就是维基百科所说的。
cas

4

Orpie为计算器和命令行爱好者计算器。它模仿了现代的HP RPN计算器,这当然是唯一真正的计算方法。

如果您是在TI,Casios等平台上成长的异端计算器,那么可以在线找到许多 RPN 教程,以开始进行重新教育。一旦您掌握了RPN的思考方式,Orpie手册最终将对您有所帮助。

计算5!在Orpie,只需键入它,你会写:5 !。您可以Enter在它们之间按以先推入5堆栈,但这不是必需的。

要计算日志10(5),请键入5 Enter ' l o Enter5在这种情况下,您确实必须先将压入堆栈,因为下一次击键不是操作员。该单引号字符将进入命令缩写模式,该模式使您可以开始键入log10,仅前两个字符就可以唯一标识。(l单独获得自然日志功能ln。)

正如任何RPN计算器,你可以得到真正的快与Orpie,有一些练习。

Orpie有现货Ubuntu仓库。FreeBSD将它包含在Ports中math/orpie。在OS X上,可以通过Homebrew安装它。第三方软件包可能适用于其他操作系统。从源代码进行构建可能会比较麻烦,因为它是用OCaml编写的,并且您可能没有安装OCaml开发环境。不过,设置不是特别困难。


2

总是有GNU Octave,命令行计算器的emacs(用于当您想要内置于计算器中的完整开发环境和编程语言以及数千种可选附件时)

R(如果您更喜欢统计数据)。

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

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

如果您恰好向它提供一个负数(应该是错误)或零(有效),则检查<= 1而不是== 1可以防止无限循环。


1

我最喜欢的是轻便,简单W-Calchttp://w-calc.sourceforge.net

您无需像手动操作那样查看手册或手动重新创建通用功能bc-这些命令几乎完全符合您的期望,因此只需键入所需内容即可使用。的确-测试按你的问题log()n!达到预期效果。

(诚​​然,我还没有听说过Orpie-很好,也许是一个更好的选择。)


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.