LINUX.ORG.RU

clisp числа с плавающей запятой


0

0

(defun y (xo xn dx)
  (cond
    ((or (and (> xo xn) (> dx 0)) (and (< xo xn) (< dx 0))) '(end tabulation))
    (t (princ "xo=") (princ xo) (princ " ") (y (+ xo dx) xn dx)
    )
  )
)

clisp:
(y 0.1 1 0.1)
xo=0.1 xo=0.2 xo=0.3 xo=0.4 xo=0.5 xo=0.6 xo=0.70000005 xo=0.8000001 xo=0.9000001 
(END TABULATION)

в кратце: 
[1]> (+ 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1)
0.8000001


как пофиксить ??? чтоб было 0.8 ровно...
★★

Никак. Переведи 0.8 в двоичную систему и поймешь, почему.

watashiwa_daredeska ★★★★
()

воттак например:

(defun y (xxo xxn xdx) (let ((xo (rationalize xxo)) (xn (rationalize xxn)) (dx (rationalize xdx))) (cond ((or (and (> xo xn) (> dx 0)) (and (< xo xn) (< dx 0))) '(end tabulation)) (t (princ "xo=") (princ (float xo)) (princ " ") (y (+ xo dx) xn dx)))))

clisp:

(y 0.1 1 0.1) xo=0.1 xo=0.2 xo=0.3 xo=0.4 xo=0.5 xo=0.6 xo=0.7 xo=0.8 xo=0.9 xo=1.0

(END TABULATION)

производительнось естессно упадёт.

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

> Have a nice bugz! 
:-) 
если ты имеешь ввиду что у тебя интервал по 1.0 включительно,
а у меня было до 0.9 то у тебя более правильнее получилось..

big 10x 

p.s.
студентам задачки решаю :-)

tugrik ★★
() автор топика
Ответ на: комментарий от tugrik

CL-USER> (+ 0.1s0 0.1s0 0.1s0 0.1s0 0.1s0 0.1s0 0.1s0 0.1s0)
0.799995s0
CL-USER> (+ 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1)
0.8000001
CL-USER> (+ 0.1d0 0.1 0.1 0.1 0.1 0.1 0.1 0.1)
0.8000001
CL-USER> (+ 0.1d0 0.1d0 0.1d0 0.1d0 0.1d0 0.1d0 0.1d0 0.1d0)
0.7999999999999999d0
CL-USER> (+ 0.1l0 0.1l0 0.1l0 0.1l0 0.1l0 0.1l0 0.1l0 0.1l0)
0.80000000000000000007L0

действительно, забавно :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.