Сокращение числа в Emacs Lisp (собственно, простое дополнение) - PullRequest
2 голосов
/ 04 июня 2010

это то, что я получаю, когда пытаюсь выполнить некоторые вычисления в emacs lisp ...

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

Может ли кто-нибудь сказать мне, что происходит и в чем разница между представлением числа с плавающей точкой с . и .0 в конце? Спасибо

Ответы [ 3 ]

7 голосов
/ 04 июня 2010

Опираясь на ответ Антона и ответа Джеймссана и читая последний файл NEWS:

Похоже, у вас есть 32-битная сборка Emacs. Emacs имеет предел для целых чисел, равный most-positive-fixnum, который традиционно был 268435455 для 32-битных сборок. В последних версиях Emacs (23.2) файл NEWS указывает:

** Считыватель Лиспа превращает слишком большие / маленькие целые числа в числа с плавающей точкой. За Например, на машинах, где 536870911' is the largest integer, reading 536870912 'дает объект с плавающей точкой `536870912.0 '.

Это изменение касается только Лисп читатель; это не влияет на актуальность переполнение целочисленных объектов.

Итак, в 23.1 и более ранних версиях (в 32-битном Emacs) 2082844800. читалось как целое число, но слишком велико, вызывая его переполнение и превращение в -64638848.

Добавление суффикса .0 в 23.1 заставило считыватель lisp рассматривать число как число с плавающей запятой, в результате чего математика получилась, как вы ожидаете.

В Emacs 23.2 читатель выполняет это преобразование из целого числа в число с плавающей запятой автоматически, если число слишком велико. Поэтому, если вы обновитесь, вам не придется об этом беспокоиться.

2 голосов
/ 04 июня 2010

Используя Emacs 23.2, я не вижу разницы между этими двумя выражениями. Какую версию вы используете и как вы выполняете расчеты?


Это зависит от того, какое наибольшее целочисленное значение может представлять ваша сборка Emacs. Все, что выше этого, переводится из целого числа в число с плавающей точкой. Вы можете получить доступ к этой информации через переменные most-positive-fixnum / most-negative-fixnum. В моем случае most-positive-fixnum - это 536870911, который меньше, чем 2082844800, и поэтому объясняет, почему оба выражения были одинаковыми для меня.

2 голосов
/ 04 июня 2010

Попробуйте

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

также

(+ 0 2082844800.)

Надеюсь, что поможет

...