2010-07-23 2 views
5

Я только начинаю изучать Lisp и задавался вопросом, как отображать рациональное число в десятичном разряде с большим количеством цифр.Как показать рациональность как длинные списки цифр в Lisp?

Если я использую (float x), где x является рациональным, то он отображает около 8 цифр или около того. Но я хочу отображать сотни цифр.

ответ

2

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

2

Вы можете использовать CLISP, реализацию Common Lisp. В качестве расширения он обеспечивает поплавки с настраиваемой точностью. См.: http://clisp.cons.org/beta/impnotes/num-concepts.html#lfd

Существуют также такие системы, как Maxima и Axiom, которые работают поверх Common Lisp. Они также могут вычислять с помощью высокоточных реалов.

Обычный стандарт Lisp, хотя и не предусматривает этого.

+0

Другой популярный реализация: Calc Дэйв Гиллеспи реализует произвольной точности с плавающей точкой в ​​Elisp (что само по себе даже не имеет bigints!). – Ken

1

Возможны реализации, на которых (format nil "~,100F" x) выполняет то, что вы хотите. Но в большинстве случаев это первое преобразует в float, а затем вычисляет цифры, которые теряют точность.

Непросто программировать свои собственные. Идея состоит в том, чтобы вычислить части до и после десятичной точки как целые числа отдельно. Вот мое предложение:

(defun number->string-with-fixed-decimal-places (x width &optional stream) 
    "Print an approximation of <x> with <width> digits after the decimal point." 
    (multiple-value-bind (int dec) (truncate x) 
    (let ((dec-shifted (truncate (* (abs dec) (expt 10 width))))) 
     (format stream "~d.~v,vd" int width #\0 dec-shifted)))) 
Смежные вопросы