[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Floating-point round-off problems.



I have been writing geometric algorithms on this machine and the accuracy is an important issue:
try using double precision,
	
(- 0.6d1 0.59d1)
0.09999999999999964d0  ;;; Better than the sun !
	
(float (- 0.6d1 0.59d1)0.0)
0.1
	
or build greater tolerance into comparisons

	
(defvar 1*epsilon* 00.000001)

(defun 1almost-zero? 0(r &optional ( *epsilon*))
  2"Checks if realnum is almost zero"
0  (declare (values boolean))
  (<= (abs r) ))

(defun 1almost-equal? 0(r1 r2 &optional( *epsilon*))
  2"Checks if two realnums are almost equal"
0  (declare (values boolean))
  (<= (abs(- r1 r2)) ))

(defun 1equal-point? 0(point1 point2 &optional( *epsilon*))            ;;; boolean check using epsilon value
  2"Point equality"
0  (declare (values boolean))
  (loop for c1 in point1
	for c2 in point2
	as same = (almost-equal? c1 c2 )
	until (not same)
	finally (return same)))