Category: it

Category was added automatically. Read all entries about "it".

парочка вопросов

В процессе изучения Лиспа натыкаюсь на некоторые моменты, с которыми пока не могу разобраться.

1) sbcl & nunion

Введём такой простой код в repl clisp, gcl и sbcl
(setf a '(1 2 3))
(setf b '(4 5 6))
(nunion a b)
; clisp, gcl => '(1 2 3 4 5 6)
; sbcl => '(3 2 1 4 5 6)

А теперь узнаем значение a: в clisp и gcl получим '(1 2 3 4 5 6), а в sbcl -- '(1 4 5 6).

Вопрос: кто неправ? У clisp и gcl результат логичный и ожидаемый, у sbcl -- не пойми что. Если поведение sbcl правильное, то каков смысл в существовании nunion?

HyperSpec ситуацию не прояснил.

2) gcl

Возьмём такую простую программку для проверки:

(defun test (a)
(print a))

(test 6)

$ gcl -f test.lisp

Error: The variable A is unbound.
Fast links are on: do (si::use-fast-links nil) for debugging
Error signalled by SYSTEM::SET-UP-TOP-LEVEL.
Backtrace: PRINT

Если в начало добавить (si::use-fast-links nil), то запускается. Чего он хочет?
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 включительно. Другая формула нужна.

Вакансии Common Lisp разработчиков

Формируем удаленную команды из 1-3 Common Lisp разработчиков как минимум на год. Если интересно, пришлите, пожалуйста, резюме и образец своего кода на Lisp или Ruby или Python или Perl или C++ или Java (собственно, на любом языке кроме PHP). Код будет проверяться на Linux или Mac - пожалуйста, проверьте, чтобы он читался.

Пишите на reshetina@cactussoft.biz.
Skype vreshetina