2012-08-16 71 views
5

Lispの小数点以下の桁数を指定する方法を知っている人はいますか?LISP - 小数点以下の桁

言って、私はREPLで次のコマンドを印刷する場合:

CL-USER 3 > (format t "~,15f" (float (/ 1 7))) 

私が手:

0.142857150000000 

しかし数は、小数点以下8桁目で四捨五入されて、私は確認する必要があります小数点以下の桁数が周期的かどうかを確認し、期間を計算します。 (実際に私はプロジェクトオイラーの問題を解決しようとしています26)。

私はこのような何かを取得する必要があります:

CL-USER 3 > (format t "~,15f" (float (/ 1 7))) 
0.142857142857142857142857142857142857.... 

はありがとうを、

ルカ

答えて

17

Common Lispはその標準の任意の正確さと山車を持っていません。

Common Lispは標準で4つの浮動小数点型を定義しています:SHORT-FLOATSINGLE-FLOAT、、LONG-FLOATです。

あなたが機能COERCE(LispWorksの例)を使用してfloatに比率を強制することができます

CL-USER 1 > (coerce (/ 1 7) 'double-float) 
0.14285714285714285D0 

または必要な長い浮動小数点数で計算するためにCLISP

LONG-FLOATとしてCommon Lispへの拡張。 GNU CLISPは非ポータブル拡張子を持っており、(バイナリ)の桁数を設定することができます。

(SETF (EXT:LONG-FLOAT-DIGITS) n)

例:ライナーの優れた答えは、 に加えて

[3]> (SETF (EXT:LONG-FLOAT-DIGITS) 1000)  
1000 
[4]> (coerce (/ 1 7) 'long-float) 
0.142857142857142857142857142857142857142857142857142857 
142857142857142857142857142857142857142857142857142857 
142857142857142857142857142857142857142857142857142857 
142857142857142857142857142857142857142857142857142857 
142857142857142857142857142857142857142857142857142857 
142857142857142857142857142857142857143L0 
+0

ありがとう、本当に役に立ちました。 – Luca

3

私はあなたがチェックしたいと思います機能をオフにするRATIONALIZE

3

また、手で分割することもできます長い、長い長い長い病気の必要性値(いくつかのコンパイラはあまりにも長い間であることが知られている。)このような何か:(

(defun divide (a b &key (precision 8)) 
    (let ((fractional 0)) 
    (multiple-value-bind (whole reminder) 
     (floor a b) 
     (unless (zerop reminder) 
     (dotimes (i precision) 
      (setf reminder (* reminder 10)) 
      (multiple-value-bind (quot rem) 
       (floor reminder b) 
      (setf fractional (+ (* fractional 10) quot)) 
      (when (zerop rem) (return)) 
      (setf reminder rem)))) 
     (values whole fractional)))) 

(multiple-value-call #'format t "~d.~d~&" (divide 1 7)) 
(multiple-value-call #'format t "~d.~d~&" (divide 1 7 :precision 54)) 

;; 0.14285714 
;; 0.142857142857142857142857142857142857142857142857142857 

は小数部分を計算するためのより効率的な方法があるかもしれませんが、彼らはあまりにも複雑で、私のために、この例のためになるでしょう)。

関連する問題