4.2 Machine找到具有下列特性的浮点数epsi:
epsi被称为机器epsilon。它对于理解浮点数具有重要意义。
我编写了下面的程序来尝试找到我的机器epsilon值到给定的搜索深度(10)。你知道我怎样才能更好地写这个程序吗?
(defpackage :find-epsi (:use cl))
(in-package :find-epsi)
(defun smaller-scale (&OPTIONAL (epsi 1.0)) (if (> (+ 1.0 epsi) 1.0) (smaller-scale (/ epsi 10)) epsi))
(defun bigger (epsi inc-unit) (if (< (+ 1.0 epsi) 1.0) (bigger (+ epsi inc-unit) inc-unit) epsi))
(defun smaller (epsi dec-unit) (if (> (+ 1.0 epsi) 1.0) (smaller (+ epsi dec-unit) dec-unit) epsi))
(defun find-epsi (&OPTIONAL (search-depth 10) (epsi (smaller-scale)) (incdec-unit epsi))
(if (= search-depth 0) epsi (find-epsi (1- search-depth) (bigger (smaller epsi incdec-unit) incdec-unit) incdec-unit)))
(format t "epsi: ~a ~%" (find-epsi))似乎发现epsilon比我原先想象的要简单得多。你觉得下面的节目怎么样?
(defpackage :find-epsi (:use cl))
(in-package :find-epsi)
(defun find-epsi (&OPTIONAL (epsi 1.0))
(if (> (+ 1.0 epsi) 1.0) ; if the variable epsi is still significant
(find-epsi (/ epsi 2)) ; halve it and try again
epsi)) ; otherwise, we have found epsilon
(format t "epsi: ~a ~%" (find-epsi))发布于 2011-03-17 22:38:27
如果假设浮点数在内存中表示为(符号、尾数、指数)元组,并假定基数为2,则可以精确地找到机器epsilon。也就是说,如果我们可以假设机器存储的浮点数使用尾数和指数的基-2表示,那么我们就知道:
1的值--这将存储为尾数的1,指数的0,即1 * 2^0。1/4可以表示为1 * (2 ^ -2)。任何具有代表性的两种权力都将在不丢失信息的情况下存储。1 + epsi将是可以存储在浮点数尾数中的大于1的最小值。编辑
第二个版本看起来比第一个版本要好得多,但我相信在find-epsi中恢复的次数有一个错误。我建议您创建一个测试函数,以查看您的结果是否是机器epsilon:
(defun epsi-sig-p (epsi)
(> (+ 1.0 epsi) 1.0))你可能会发现(is-sig (find-epsi))是#f..。这还建议您可以重构(在干原理下) find-epsi,以便在find-epsi中使用该测试函数:
(defun find-epsi (&OPTIONAL (epsi 1.0))
(if (epsi-sig-p epsi)
(find-epsi (/ epsi 2))
epsi))但我们还没有改变行为来修正计算。为此,我建议另一个例程,以检查是否应该尝试下一个可能的epsi:
(defun next-epsi (epsi) (/ epsi 2))
(defun is-epsi-p (epsi)
(and (epsi-sig-p epsi) (not (epsi-sig-p (next-epsi epsi)))))
(defun find-epsi (&OPTIONAL (epsi 1.0))
(if (is-epsi-p epsi)
epsi
(find-epsi (next-epsi epsi))))is-epsi-p现在应该返回#t。
https://codereview.stackexchange.com/questions/1324
复制相似问题