Нашел баг в библиотеке 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 включительно. Другая формула нужна.