2010-07-23 1 views

Répondre

2

Vous devrez implémenter un algorithme pour effectuer la division longue et calculer vous-même les chiffres. Il n'y a pas de type de données natif capable de contenir des centaines de chiffres décimaux.

2

Vous pouvez utiliser CLISP, une implémentation de Common Lisp. En tant qu'extension, il fournit des flotteurs avec une précision réglable. Voir: http://clisp.cons.org/beta/impnotes/num-concepts.html#lfd

Il existe également des systèmes tels que Maxima et Axiom qui s'exécutent sur Common Lisp. Ceux-ci peuvent également calculer avec des réels de haute précision.

La norme Common Lisp ne le prévoit pas.

+0

Une autre implémentation populaire: Calc de Dave Gillespie implémente un flottant de précision arbitraire dans Elisp (qui lui-même n'a même pas de bigints!). – Ken

1

Il peut y avoir des implémentations sur lesquelles (format nil "~,100F" x) fait ce que vous voulez. Mais sur la plupart de ces convertis d'abord à un flotteur, puis calcule les chiffres, ce qui perd de la précision.

Ce n'est pas trop difficile de programmer le vôtre. L'idée est de calculer séparément les parties avant et après le point décimal. Voici ma proposition:

(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)))) 
Questions connexes