2010-07-23 6 views

risposta

2

Dovrai implementare un algoritmo per eseguire fondamentalmente la divisione lunga e calcolare le cifre manualmente. Non esiste un tipo di dati nativo in grado di contenere centinaia di cifre decimali.

2

È possibile utilizzare CLISP, un'implementazione di Common Lisp. Come estensione fornisce galleggianti con precisione impostabile. Vedi: http://clisp.cons.org/beta/impnotes/num-concepts.html#lfd

Ci sono anche sistemi come Maxima e Axiom che funzionano su Common Lisp. Questi possono anche calcolare con reals di alta precisione.

Tuttavia, lo standard Common Lisp non lo fornisce.

+0

Un'altra implementazione popolare: Calc di Dave Gillespie implementa precisione arbitraria virgola mobile in Elisp (che di per sé non ha nemmeno bigints!). – Ken

1

Ci possono essere implementazioni su cui (format nil "~,100F" x) fa quello che vuoi. Ma per la maggior parte questo prima si converte in un float, quindi calcola i numeri, che perde precisione.

Non è troppo difficile da programmare. L'idea è di calcolare le parti prima e dopo il punto decimale come numeri interi separatamente. Ecco la mia proposta:

(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)))) 
Problemi correlati