如果我在emacs-lisp中编写此函数:
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
=> factorial
Run Code Online (Sandbox Code Playgroud)
它适用于像5或10这样的小数字,但如果我尝试计算(因子33),答案是-1211487723752259584,这显然是错误的,所有大数字都会破坏这个功能.在python中,这不会发生.是什么导致了这个问题?
phi*_*ils 12
calc处理大数字时,您始终可以调用Emacs的库.
(defun factorial (n)
(string-to-number (factorial--1 n)))
(defun factorial--1 (n)
(if (<= n 1)
"1"
(calc-eval (format "%s * %s"
(number-to-string n)
(factorial--1 (- n 1))))))
ELISP> (factorial 33)
8.683317618811886e+036
Run Code Online (Sandbox Code Playgroud)
进一步阅读:
(calc) RET(calc) Calling Calc from Your Programs RETzck*_*zck 11
整数具有特定范围.超出此范围的值无法表示.这是大多数(但不是全部)编程语言的标准.您可以通过检查值来找到Emacs Lisp的整数数据类型可以在您的计算机上处理的最大数字most-positive-fixnum.
转到你的*scratch*缓冲区 - 或任何Lisp缓冲区 - 并输入most-positive-fixnum.将光标放在末尾,然后按C-x C-e.在我的电脑上,我得到2305843009213693951作为值.你可能会有所不同:我在64位机器上,这个数字是关于2^61.阶乘33的解决方案是8683317618811886495518194401280000000.这大约是2 ^ 86,这也是我的Emacs可以处理的.(我使用Arc来精确地计算它,因为Arc可以表示任何大小的整数,受到无聊内容的影响,例如你已安装的内存量).
最简单的解决方案似乎是保罗的解决方案:
(defun factorial (n) (calc-eval (format "%s!" n)))
ELISP> (factorial 33)
8683317618811886495518194401280000000
Run Code Online (Sandbox Code Playgroud)
但是,为了好玩,我尝试了另一种 Calc 方式,而不使用calc-eval and string。因为可以通过这种方式完成更复杂的带有 Calc 的 Emacs Lisp 程序。
Emacs Lisp 中的Calcdefmath和calcFunc-函数非常强大。
(defmath myFact (n) (string-to-number (format-number (calcFunc-fact n))))
ELISP> (calcFunc-myFact 33)
8.683317618811886e+36
Run Code Online (Sandbox Code Playgroud)