首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >机器epsilon -找到epsi

机器epsilon -找到epsi
EN

Code Review用户
提问于 2011-03-17 13:49:47
回答 1查看 318关注 0票数 2

4.2 Machine找到具有下列特性的浮点数epsi:

  1. 1.0+epsi大于1.0和
  2. 设m_b_e小于epsi的任何数。则1.0+m等于1.0。

epsi被称为机器epsilon。它对于理解浮点数具有重要意义。

我编写了下面的程序来尝试找到我的机器epsilon值到给定的搜索深度(10)。你知道我怎样才能更好地写这个程序吗?

代码语言:javascript
复制
(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比我原先想象的要简单得多。你觉得下面的节目怎么样?

代码语言:javascript
复制
(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))
EN

回答 1

Code Review用户

回答已采纳

发布于 2011-03-17 22:38:27

如果假设浮点数在内存中表示为(符号、尾数、指数)元组,并假定基数为2,则可以精确地找到机器epsilon。也就是说,如果我们可以假设机器存储的浮点数使用尾数和指数的基-2表示,那么我们就知道:

  • 机器将准确地以浮点存储1的值--这将存储为尾数的1,指数的0,即1 * 2^0
  • 机器将存储它可以用尾数中的一个位来表示的所有2的幂,并通过改变指数来表示。例如,1/4可以表示为1 * (2 ^ -2)。任何具有代表性的两种权力都将在不丢失信息的情况下存储。
  • 1 + epsi将是可以存储在浮点数尾数中的大于1的最小值。

编辑

第二个版本看起来比第一个版本要好得多,但我相信在find-epsi中恢复的次数有一个错误。我建议您创建一个测试函数,以查看您的结果是否是机器epsilon:

代码语言:javascript
复制
(defun epsi-sig-p (epsi)
  (> (+ 1.0 epsi) 1.0))

你可能会发现(is-sig (find-epsi))#f..。这还建议您可以重构(在干原理下) find-epsi,以便在find-epsi中使用该测试函数:

代码语言:javascript
复制
(defun find-epsi (&OPTIONAL (epsi 1.0))
  (if (epsi-sig-p epsi)
    (find-epsi (/ epsi 2))
    epsi))

但我们还没有改变行为来修正计算。为此,我建议另一个例程,以检查是否应该尝试下一个可能的epsi

代码语言:javascript
复制
(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

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/1324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档