Category: литература

Category was added automatically. Read all entries about "литература".

pony, django

Точность вычислений - числа с плавающей точкой. Экспонента считается неверно?

Нашел баг в библиотеке alexandria: субфакториалы (http://en.wikipedia.org/wiki/Subfactorial) читаются неверно, начиная с 11.

Формула там верная - (floor (/ (+ 1 (factorial n)) (exp 1)))

Но, например, для 11 получается (/ 39916801 2.7182817) => 1.4684571e7, после округления получаем 14684571 вместо 14684570.

Ладно, точность (exp 1) маленькая, пишем явно
(/ 39916801 2.7182818284590452353602874713526624977572470936999595749669), но все равно получаем 1.4684571e7

Python, например, считает точнее:
>>> 39916801 / 2.7182818284590452353602874713526624977572470936999595749669
14684570.445231671

Как это побороть (считать с большей точностью)?

Компилятор - SBCL

P.S. Обнаружил, что экспонента считается неверно.
CL-USER> (exp 1)
2.7182817

А более точное значение - 2.7182818284590452353602874713526624977572470936999595749669..., т.е.должно округляться до 2.7182818

P.P.S
Уже подсказали, что надо писать (exp 1d0), тогда проблемы с точностью решаются.
В общем-то, это и будет фиксом для alexandria:subfactorial, но только для чисел до 18 включительно. Другая формула нужна.
светлое будущее
  • potan

Вопросы по Common Lisp.

1. Взаимная рекурсия.
У меня есть две взаимно-рекурсивные функции и sbcl на них выдает STYLE-WARNING. Для методов я могу сказать defgeneric до конкретной реализации и проблем со взаимной рекурсией не возникает. А для обычных функций способа ее предварительно объявить я не нашел. Он вообще есть?

2. Модули.
Как они работают, я так и не понял :-(.
Пишу в одном файле
(defpackage :defuncallizator
  (:use :common-lisp)
  (:export funcallize fn defcf defcmethod))

(in-package :defuncallizator)

а в другом
(load "defuncallizator")

(defpackage :cl-monadic-parser
  (:use :common-lisp :defuncallizator))

(in-package :cl-monadic-parser)


Все работает, но при компиляции второго файла clispом выдается *** - SYSTEM::%FIND-PACKAGE: There is no package with name "DEFUNCALLIZATOR", переменная *package*, что в sbcl, что в clisp не изменяется и не получается вызывать мои функции из REPL, даже с использованием : или ::.

3. Работа с последовательностями.
Есть ли эффективные аналоги null и cdr для произвольных последовательностей?
(lambda (x) (eql 0 (length x))) и (lambda (x) (subseq x 1)) выполняют лишнюю работу, которая для больших последовательносей может оказаться недопустимо большой, а полиморфизм терять не хочется.
Можно ли переносимо создавать собственные типы последовательностей?

4. Последовательности и файлы.
Есть ли переносимый способ работать с файлом на чтение как с последовательностью? В sbcl есть библиотека simple-stream, но она, похоже, не совсем стандартная.
tree

Перевод Practical Common Lisp

Peter Seibel разрешил инициативной группе лиспников сделать перевод его книги Practical Common Lisp на русский язык. При этом после окончания перевод будет выложен на его сайте. Некоторые участники перевода хотят организовать издание перевода в России, но пока давайте не будем загадывать так далеко.

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

В общем, добро пожаловать. :)