有人说双精度浮点数的机器epsilon是2 ^ -53而其他(更常见的)是2 ^ -52。我已经使用除了1之外的整数以及从上方和下方(在matlab中)进行估算来估计机器精度,并且已经获得两个值作为结果。为什么在实践中可以观察到这两个值?我认为应该总是在2 ^ -52左右产生一个epsilon。
答案 0 :(得分:7)
术语“机器epsilon”存在固有的模糊性,因此要解决此问题,通常将其定义为1
与下一个更大的可表示数字之间的差异。 (这个数字实际上(并非偶然)通过逐字递增二进制表示获得。)
IEEE754 64位浮点数有52个显式尾数位,因此53包括隐式前导1
。所以连续两个数字是:
1.0000 ..... 0000
1.0000 ..... 0001
\-- 52 digits --/
因此两者之间的差异是2 -52 。
答案 1 :(得分:2)
这取决于你选择哪种方式。
1 + 2^-53
恰好位于1
和1 + 2^-52
之间的中间位置,它们在双精度浮点数中是连续的。所以,如果你把它四舍五入,它就不同于1;如果你将它向下舍入,则等于1.
答案 2 :(得分:1)
实际上有两种定义"机器精度"这听起来完全相同,但并非如此,因为它们会为机器epsilon产生不同的值:
eps1
,1.0 + x > 1.0
。eps2 = x - 1.0
,其中x
是x > 1.0
的最小可表示浮点数。严格来说,这些定义是等价的,即eps1 == eps2
,但我们不是在谈论真正的数字,而是关于浮点数。这意味着隐式舍入和取消,这意味着近似地eps2 == 2 * eps2
(至少在使用IEEE-754浮点数的最常见架构中)。
更详细地说,如果我们让某些x
从0.0
转到1.0 + x > 1.0
的某个点,则会在x == eps1
(根据定义1)达到此点。但是,由于综述,1.0 + eps1
的结果不 1.0 + eps1
,但下一个可表示的浮点值大于大于1.0 - 是,eps2
(根据定义2)。所以,实质上,
eps2 == (1.0 + eps1) - 1.0
(数学家会对此感到畏缩。)并且由于舍入行为,这意味着
eps2 == eps1 * 2 (approximatively)
这就是为什么"机器epsilon"有两个定义,既合法又正确。
就个人而言,我发现eps2
越多,越强大,越#34;定义,因为它不依赖于实际的舍入行为,只取决于表示,但我不会说它比另一个更正确。一如既往,这一切都取决于背景。只要清楚你在谈论"机器epsilon"时使用的定义。防止混淆和错误。