представление бесконечности и NAN независимо от реализации

Есть ли в Common Lisp независимый от реализации способ представления бесконечности или не числа (NAN)? Это должно быть двойное число с плавающей запятой и иметь как положительные, так и отрицательные значения. В SBCL результаты

(apropos "INFINITY")

включают

SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY (bound)
SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY (bound)

но мне нужно, чтобы он был доступен во всех реализациях. У меня есть дополнение к пакету, который нужно написать, который работает на всех платформах и требует представления бесконечности и NAN. Достаточно даже функций из другой библиотеки.

Я загрузил iee-floats, и теперь это часть моей библиотеки. У меня есть функция, которая определяет, является ли число NaN, и функция, которая определяет, является ли число бесконечным; Я не тестировал NaN out, но моей функции бесконечности нужно, чтобы число было двойным с плавающей запятой. SBCL SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY работает, но мне нужно, чтобы он не зависел от реализации.


person Community    schedule 14.10.2013    source источник
comment
github.com/bytecurry/nonfinite   -  person Arto Bendiken    schedule 18.05.2018


Ответы (3)


Если вы загружаете GSLL (в quicklisp), у вас есть gsl:+positive-infinity+, gsl:+negative-infinity+ и даже gsl:+nan+. Они должны работать везде, где можно установить GSLL.

person Liam    schedule 18.10.2013
comment
из моего? ... моей функции бесконечности нужно, чтобы число было двойным с плавающей запятой .... SB-EXT: DOUBLE-FLOAT-POSITIVE-INFINITY от SBCL работает, но мне нужно, чтобы он не зависел от имплементации, я бы хотел, чтобы GSLL мог выполнить это требование искал предлог для его включения ... а также любой способ сократить время загрузки GSLL. Я не загружаю его все время, потому что он такой большой, но я бы хотел, чтобы он загружался все время. - person ; 19.10.2013
comment
Я видел ошибку в ASDF, когда он перекомпилирует все, что я загружаю. Возможно, именно поэтому у вас долгое время загрузки? В любом случае вы можете создать мир с помощью save-lisp-and-die с GSLL, и тогда ваше время загрузки будет не больше, чем загрузка SBCL. - person Liam; 19.10.2013

Запись Rosetta Code в разделе Common Lisp на Infinity гласит:

Common Lisp не определяет бесконечное значение. Однако некоторые реализации могут поддерживать IEEE infinity. Например, CMUCL поддерживает специальные значения IEEE < / а>. Common Lisp действительно указывает, что реализации определяют константы с наибольшим (и наименьшим) положительным (и отрицательные) значения. Они могут отличаться в зависимости от реализации.

Cliki перечисляет пакет ieee-floats, который может помочь (но обратите внимание, что в нем говорится о :infinity):

IEEE-Floats предоставляет способ преобразования значений типа float и double-float в и из их представления в двоичном формате, как определено IEEE 754 (который обычно используется процессорами и сетевыми протоколами).

Библиотека определяет функции кодирования и декодирования для общих 32-битных и 64-битных форматов, а также макрос для определения аналогичных функций для других форматов. Функции по умолчанию не обнаруживают особых случаев для NaN или бесконечности, но могут быть сгенерированы функции, которые это делают, и в этом случае ключевые слова: not-a-number,: positive-infinity и: negative-infinity используются для их представления.

Похоже, вам лучше всего найти некоторые значения IEEE в реализациях, которые вы хотите поддерживать, и написать уровень межплатформенной совместимости [который, конечно, вы должны затем опубликовать и поделиться с другими :)].

person Community    schedule 14.10.2013
comment
@ user2862490 Я пометил ответ вики сообщества, так как особо мало сделал больше, чем быстрый поиск в Google некоторых возможных решений, поэтому любой, у кого есть репутация не менее 100, может его редактировать). Надеюсь, мы получим совместные результаты по этому поводу. - person Joshua Taylor; 15.10.2013
comment
Спасибо ... это из любопытства, просто загружая каждую имплементацию, а затем находя представление бесконечности с двойным поплавком, простое, если acl, то бесконечность = что-то, если sbcl, то бесконечность = что-то вроде вещи - person ; 15.10.2013
comment
@ user2862490 Вы спрашиваете, какой должна быть кроссплатформенная библиотека? В нем могут быть определения вроде (defconstant common-numbers:+positive-infinity+ #+sbcl SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY #+lispworks lispworks:pos-infinity ...). (Бит с LispWorks - это просто пример; я не знаю, представлена ​​ли там бесконечность и как.) Тогда люди могут использовать common-numbers:+positive-infinity+ в своем коде, и он будет работать во всех поддерживаемых реализациях. - person Joshua Taylor; 16.10.2013

Следующее требует, чтобы ловушки с плавающей запятой были отключены, но ... поскольку вы обрабатываете такие значения, вам все равно нужно отключить ловушки. Т.е. рассмотрите этот драгоценный камень из стандарта: «Это зависит от реализации, возникают ли ловушки с плавающей запятой, и могут ли они быть включены или отключены. Следовательно, соответствующий код может устанавливать обработчики для этого условия, но не должен зависеть от его сигнализации. "

(eval-when (:compile-toplevel :load-toplevel :execute)
  #+sbcl (sb-int:set-floating-point-modes :traps nil)
  #+cmucl (ext:set-floating-point-modes :traps nil)
  #+linux (cffi:foreign-funcall "fedisableexcept" :int -1))

(defconstant +double+inf+ (* 2 most-positive-double-float))
(defconstant +double-inf+ (* 2 most-negative-double-float))
(defconstant +double-nan+ (/ 0d0 0d0))
person kacz    schedule 08.06.2017