이것은 이전에 게시 한 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 문서 당 훨씬 더 예상 결과를 얻을 수 있습니다.
[플로트 정밀 전염의 12.1.4.4 규칙 (http://www.lispworks.com/documentation/HyperSpec/Body/12_add.htm) 말한다 "의 결과 :
는 CLISP 설명서를 참조하십시오 수치 함수는 함수에 대한 모든 부동 소수점 인수 중에서 가장 큰 형식의 부동 소수점입니다. " 두 배의 플로트를 넣으면 두 배의 플로트가 나옵니다. 당신이 얻는 행동은 흥미 롭습니다. –@JoshuaTaylor GNU CLISP 2.49를 사용하고 있음을 나타 내기 위해 제 질문이 업데이트되었습니다. – lurker
내 대답보기. 이 설정은 CLISP에 있습니다. –