2012-08-16 3 views
5

Lisp에서 float에 소수점 이하 자릿수를 지정하는 방법을 아는 사람이 있습니까? 나는 REPL에서이 명령을 인쇄하는 경우LISP - 소수점 이하 자릿수

말은 :

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는 표준에서 4 개의 부동 유형을 정의합니다 : SHORT-FLOAT, SINGLE-FLOAT, , LONG-FLOAT.

당신은 기능 COERCE (LispWorks 예)를 사용하여 부동 소수점에 대한 비율을 강제 할 수

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

또는 LONG-FLOAT CLISP

당신이 필요 이상 부동 소수점 숫자를 계산하는 등의

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 

가 소수 부분을 계산하는 더 효율적인 방법 일 수 있지만, 너무 복잡 수도 있습니다 (: 이런 식으로 뭔가, 병이 필요 값은 더 이상 다음 오래 오래 오래 (알려진 어떤 컴파일러 너무 오래하는) 나를 위해, 그리고이 예제에 대한 것입니다).

관련 문제