Сергей Дымченко (kit1980ukr) wrote in ru_lisp,
Сергей Дымченко
kit1980ukr
ru_lisp

Categories:

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

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

  • определение контуров предметов на видео

    Я дико извиняюсь, могу ошибаться, но три-пять лет назад в ЖЖке пробегал пост от лисповода, в котором товарищ демонстрировал как можно просто без…

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

    В процессе изучения Лиспа натыкаюсь на некоторые моменты, с которыми пока не могу разобраться. 1) sbcl & nunion Введём такой простой код в repl…

  • group

    Доброго времени суток. Нужна была функция, которая группирует список группами по несколько элементов. Получился не совсем красивый велосипед. Никто…

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments