求助ELisp两个浮点数比较是否相等的问题

在看 叶文彬 大神的ELisp教程,看到基本数据类型之一 ── 数字里面比较两个浮点数是否相等的时候,给了一个函数:

(defvar fuzz-factor 1.0e-6)

(defun approx-equal (x y)
  (or (and (= x 0) (= y 0))
      (< (/ (abs (- x y))
            (max (abs x) (abs y)))
         fuzz-factor)))

(approx-equal foo bar)

有个疑问,上面(abs (- x y)) 得出后为什么还要除 (max (abs x) (abs y))啊? 直接让(abs (- x y))fuzz-factor比较不就行了? 是我有什么数学概念不了解?请教下坛子里的各位一下:pray:

都可以,除以 max 会让精度更高,你可以不除

这个问题好像在sicp的开头讨论过,我才看过不久,然而已然记不清了,大概是,不除的话,fuzz-factor是固定的,我们可能希望2e10(2e10+1)被判为相等,也希望8e-99e-9被判为不等,然而不除的时候这两个都做不到。除以absmax可以适应参数的数量级大小。

大概道理我应该没记错,但是除以absmax是不是最好的解法,这个完全不记得了。

就是相对误差呀。

对对对,一语惊醒梦中人 :joy: