2010-07-23 9 views

Respuesta

2

Tendrá que implementar un algoritmo para básicamente hacer la división larga y calcular los dígitos usted mismo. No hay un tipo de datos nativo capaz de contener cientos de dígitos decimales.

2

Puede usar CLISP, una implementación de Common Lisp. Como extensión proporciona flotadores con precisión configurable. Ver: http://clisp.cons.org/beta/impnotes/num-concepts.html#lfd

También hay sistemas como Maxima y Axiom que se ejecutan sobre Common Lisp. Estos también pueden calcular con reales de alta precisión.

El estándar Common Lisp no lo proporciona.

+0

Otra aplicación muy popular: Calc de Dave Gillespie implementa precisión arbitraria de punto flotante en Elisp (que en sí mismo no tiene ni siquiera bigints!). – Ken

1

Puede haber implementaciones en las que (format nil "~,100F" x) haga lo que desee. Pero en la mayoría de estos primeros convierte a un flotador, luego calcula los dígitos, que pierde precisión.

No es demasiado difícil de programar el suyo. La idea es calcular las partes antes y después del punto decimal como números enteros por separado. Aquí está mi propuesta:

(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)))) 
Cuestiones relacionadas