Emacs Lisp数字运算(实际上,简单的加法)

时间:2010-06-04 15:42:19

标签: emacs elisp

当我尝试在emacs lisp中进行一些计算时,这就是我得到的......

(+ 2082844800. 1274511600.0)
=> 1209872752.0
(+ 2082844800.0 1274511600.0)
=> 3357356400.0

有人能告诉我发生了什么,最后用..0表示浮点数有什么区别?感谢

3 个答案:

答案 0 :(得分:7)

以Anton的answer和jamessan的answer为基础,阅读最新的NEWS文件:

看起来你有一个32位的Emacs版本。 Emacs对整数的限制为most-positive-fixnum,对于32位构建,传统上为268435455。在最新的Emacs(23.2)中,NEWS file表示:

  

** Lisp阅读器将太大/太小的整数转换为浮点数。对于   例如,在机器上   536870911' is the largest integer, reading 536870912'给出了   浮点对象`536870912.0'。

     

此更改仅涉及Lisp   读者;它不会影响实际情况   整数对象溢出。

因此,在23.1及更早版本(在32位Emacs上),2082844800.被读取为整数,但是太大,导致它溢出并转变为-64638848

在23.1中添加.0后缀迫使lisp阅读器将数字视为浮点数,从而导致数学结果如您所愿。

在Emacs 23.2中,如果数字太大,读者会自动从整数转换为浮点数。因此,如果您升级,您将不必担心这一点。

答案 1 :(得分:2)

尝试

(floatp 2082844800.) 
(floatp 2082844800.0)
(integerp 2082844800.)

(+ 0 2082844800.)

希望有所帮助

答案 2 :(得分:2)

使用Emacs 23.2,我发现两个表达式之间没有区别。您使用的是哪个版本以及如何执行计算?


这取决于您的Emacs构建可以表示的最大整数值。以上任何内容都会从整数提升为浮点数。您可以通过most-positive-fixnum / most-negative-fixnum变量访问此信息。在我的情况下,most-positive-fixnum是536870911,小于2082844800,因此解释了为什么两个表达式对我来说都是一样的。