2014-01-25 1 views
2

이것은 이전에 게시 한 question on double-float의 후속 조치입니다. 아마 Lisp 개념의 근본적인 것에 대해 사과하지만, 아직 이해하지 못했습니다.함수의 숫자 데이터 유형 이해

이 문제의 경우 GNU CLISP 2.49 (2010-07-07)을 사용하고 있습니다.

그것은 나에게 단 정밀도 부동 소수점을주고
> (sr 2 0.00001) 
1.4142157 

(기본값 :

한다고 가정 단순히 뉴턴의 방법을 통해 제곱근을 결정하는 다음과 같은 기능을 가지고 다음과 같이

(defun sr (n eps) 
    (when (>= n 0) 
    (do ((x (/ n 2.0) (/ (+ x (/ n x)) 2.0))) 
     ((< (abs (- (* x x) n)) eps) 
     x)))) 

나는이를 호출 할 수 있습니다). 말이된다. 내가 eps을 너무 작게 만들면 때문에 정밀도의 부족, 제대로 작동하지 않고 무한 루프로 간다 : 나는 배정 밀도 값을 호출하는 경우

> (sr 2 0.00000001) 
[just sits there...] 

, 나는 아직 단 정밀도 결과를 얻을 수 있습니다 : 내 기능을 재정의하는 경우

> (sr 2.0d0 0.00001d0) 
1.4142157 
> (sr 2.0d0 0.00000001d0) 
[just sits there...] 

는 그러나 다음과 같이

(defun sr (n eps) 
    (when (>= n 0) 
    (do ((x (/ n 2.0d0) (/ (+ x (/ n x)) 2.0d0))) 
     ((< (abs (- (* x x) n)) eps) 
     x)))) 

것은 그때에 상관없이 내가 먹이를 어떻게 배정 밀도를 얻을 :

그것을 먹이
> (sr 2 0.00001) 
1.4142156862745097d0 

그리고 지금은 eps 작은 인해 증가 된 정밀도로 작동합니다

그래서 내 질문은
> (sr 2 0.00000001) 
1.4142135623746899d0 

: 함수에 의해 적용되는 정밀 완전히 내가 상수에서 지정하는 정밀도에 의해 구동되는 것이 포함 된 산술 표현식에서 사용하고 있습니까? 그렇다면 함수에 상수가 없다면 어떨까요? 그런 다음 계산의 정확도와 결과를 결정하는 것은 무엇입니까?


칙은

난 그냥 SBCL 1.0.57-1.fc17에이 문제를 다시 테스트 나는 주석에서 인용 @JoshuaTaylor 문서 당 훨씬 더 예상 결과를 얻을 수 있습니다.

+0

[플로트 정밀 전염의 12.1.4.4 규칙 (http://www.lispworks.com/documentation/HyperSpec/Body/12_add.htm) 말한다 "의 결과 :

는 CLISP 설명서를 참조하십시오 수치 함수는 함수에 대한 모든 부동 소수점 인수 중에서 가장 큰 형식의 부동 소수점입니다. " 두 배의 플로트를 넣으면 두 배의 플로트가 나옵니다. 당신이 얻는 행동은 흥미 롭습니다. –

+0

@JoshuaTaylor GNU CLISP 2.49를 사용하고 있음을 나타 내기 위해 제 질문이 업데이트되었습니다. – lurker

+0

내 대답보기. 이 설정은 CLISP에 있습니다. –

답변

4

CLISP와 ANSI CL 표준이 호환되지 않는 것처럼 보입니다.

CL-USER 20 > (/ 2.0d0 2.0) 
1.0D0 

CLISP이 제공 :

[4]> (/ 2.0d0 2.0) 
1.0 

이 더블 플로트해야

는 ANSI CL 표준은 모든 인수의 가장 큰 유형으로 결과를 필요로한다.

당신은 표준 ANSI CL 동작에 CLISP에서 그것을 변경할 수 있습니다

[9]> CUSTOM:*FLOATING-POINT-CONTAGION-ANSI* 
NIL 
[10]> (setf CUSTOM:*FLOATING-POINT-CONTAGION-ANSI* t) 
T 
[11]> (sr 2.0d0 0.00001d0) 
1.4142156862745097d0 

는 이제 원하는 결과를 다시 제공합니다. 12.2.4.1. Rule of Float Precision Contagion

+0

아 ... 방금 SBCL로 시도했지만 실제로 예상대로 작동합니다. 그래서 나는이 반응에 동의한다. :) – lurker

+0

재미 있습니다. ''부동 소수점 - 컨텍스트 -ANSI * '의 기본값이''T' '가 아닌 이유가 궁금합니다. 그러나 문서의 약간은 죄책감의 어떤 양의 CLISP를 면제합니다. ;) – lurker

+0

@Rainer 당신은 나를 때렸다. CLISP 및 12.1.4.4에 대한 인터넷 검색을하고 https://groups.google.com/d/msg/comp.lang.lisp/Z3orricdT8/Bw57u1MQzYEJ, 잘 했어 설정을 언급하는이 게시물을 생각해 냈어! –