当我尝试在emacs lisp中进行一些计算时,这就是我得到的......
(+ 2082844800. 1274511600.0)
=> 1209872752.0
(+ 2082844800.0 1274511600.0)
=> 3357356400.0
有人能告诉我发生了什么,最后用.
和.0
表示浮点数有什么区别?感谢
答案 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,因此解释了为什么两个表达式对我来说都是一样的。