2010-07-23 5 views

Antwort

2

Sie müssen einen Algorithmus implementieren, um die lange Division durchzuführen und die Ziffern selbst zu berechnen. Es gibt keinen nativen Datentyp, der Hunderte von Dezimalziffern speichern kann.

2

Sie können CLISP verwenden, eine Implementierung von Common Lisp. Als Erweiterung bietet es Floats mit einstellbarer Genauigkeit. Siehe: http://clisp.cons.org/beta/impnotes/num-concepts.html#lfd

Es gibt auch Systeme wie Maxima und Axiom, die auf Common Lisp laufen. Diese können auch mit hoher Genauigkeit berechnet werden.

Der Common-Lisp-Standard bietet dies jedoch nicht.

+0

Eine weitere beliebte Implementierung: Dave Gillespie Calc implementiert Gleitkomma-Gleitkomma in Elisp (die selbst nicht Bigints hat!). – Ken

1

Es kann Implementierungen geben, bei denen (format nil "~,100F" x) das tut, was Sie wollen. Aber in den meisten Fällen wird dies zuerst in einen Gleitkommawert umgewandelt, dann werden Ziffern berechnet, wodurch die Genauigkeit verloren geht.

Es ist nicht zu schwer, eigene Programme zu programmieren. Die Idee besteht darin, die Teile vor und nach dem Dezimalpunkt als Ganzzahlen getrennt zu berechnen. Hier ist mein Vorschlag:

(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)))) 
Verwandte Themen