2010-07-23 11 views

cevap

2

Temel olarak uzun bölümü yapmak ve rakamları kendiniz hesaplamak için bir algoritma uygulamanız gerekecektir. Yüzlerce ondalık basamak tutmaya yetecek yerel veri türü yoktur.

2

Ortak Lisp'in bir uygulaması olan CLISP'yi kullanabilirsiniz. Bir uzantı olarak ayarlanabilir kesinliğe sahip şamandıralar sağlar. Bkz .: http://clisp.cons.org/beta/impnotes/num-concepts.html#lfd

Ayrıca Common Lisp üzerinde çalışan Maxima ve Axiom gibi sistemler de vardır. Bunlar ayrıca yüksek hassasiyetli işlemlerle hesaplanabilir.

Ortak Lisp standardı bunu sağlamaz.

+0

Başka bir popüler uygulama: Dave Gillespie'nin Calc'i, Elisp'de keyfi-hassas kayan nokta uygular (kendisinin bile büyük bir yanı yoktur!). – Ken

1

(format nil "~,100F" x)'un ne istediğini gerçekleştiren uygulamalar olabilir. Fakat en başta bu ilk önce bir kayan noktaya dönüşür, daha sonra rakamları hesaplar ve hassasiyeti kaybeder.

Kendi programınızı yapmak çok zor değil. Fikir, ondalık noktadan önce ve sonra parçaları tamsayılar olarak ayrı ayrı hesaplamaktır. İşte benim önerim:

(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)))) 
İlgili konular