(defun c:t1( / pt1 pt2)
(princ “n거리 0.2 차이값 검토”)
(setq pt1 (getpoint “n하단점 입력 : “))
(setq pt2 (getpoint pt1 “n상단점 입력 :”))
(setq aa (- (- (cadr pt2) (cadr pt1)) 0.2))
(princ (strcat “n 차이값 : ” (vl-princ-to-string aa)))
(princ)
)
(defun c:t2( / pt1 pt2)
(princ “n거리 0.2 차이값 검토”)
(setq pt1 (getpoint “n하단점 입력 : “))
(setq pt2 (getpoint pt1 “n상단점 입력 :”))
(setq aa (- (distance pt1 pt2) 0.2))
(princ (strcat “n 차이값 : ” (vl-princ-to-string aa)))
(princ)
)
명령: t1
거리 0.2 차이값 검토
하단점 입력 :
상단점 입력 :
차이값 : 2.83107e-15
명령:
명령: t2
거리 0.2 차이값 검토
하단점 입력 :
상단점 입력 :
차이값 : 2.83107e-15
예를 들어 객체를 옵셋을 0.2 했을때
getpoint로 포인트점 선택후 거리 계산시
위와 같이 소수점 차이값이 납니다
_$ (- (cadr pt2) (cadr pt1))
0.2
_$ (- (- (cadr pt2) (cadr pt1)) 0.2)
2.83107e-15
_$
_$ (distance pt1 pt2)
0.2
_$ (- (distance pt1 pt2) 0.2)
2.83107e-15
_$
이런식으로요 이거 시스템변수 문제 인지 아니면 자체 오류 인지요? 도면에 문제가 있는건지
지금 모든 도면에서 오류가 나는거 같습니다
해결 방법 아시는분 답변 부탁 드립니다.
답변 감사합니다
타 사이트에서 (rtos (distance pt1 pt2) 2 16) 이렇게 확인해 보라해서 확인해보니
_$ (rtos (distance pt1 pt2) 2 16)
“0.1999999999999993”
이렇게 나오네요 수야님 답변으로 인해 이해할수 있게 되었습니다.
앞으로는 문자 숫자 이런식으로 변환해서 값을 확인 해야 겠네요
컴퓨터 태생 자체의 문제입니다 이진으로만 숫자를 표현하다보니 소수는 근사값을 표현하는것이지 정확한 값을 표현하지 못합니다 그러니 정확한 값을 표현하게 사용자가 지정을 해줘야 합니다 (atof(rtos aa 2 1)) (예전에 어떤 강의에서 들은 거라 정확하지는 않지만 어쨌든 컴퓨터는 숫자를 정확하게 표현하는게 아니라는 말은 맞습니다)