该文档将 .Machine$double.eps 描述为 1 + x != 1 的最小正浮点数 x 。所以我希望以下内容产生 1:

options(digits=17)
1 + .Machine$double.eps
# [1] 1.0000000000000002

但事实并非如此。看来我必须尽可能低到 0.5*.Machine$double.eps 才能达到预期的四舍五入。我对 .Machine$double.eps 有什么误解吗?这是平台相关的吗? ( session 信息()下面)
> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] en_CA.UTF-8/en_CA.UTF-8/en_CA.UTF-8/C/en_CA.UTF-8/en_CA.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] tools_3.0.2

谢谢

最佳答案

只是因为有趣,这里是the code R uses to calculate eps(提取到自己的程序中):

#include <stdio.h>

int main() {
    double temp, tempa, a;
    double eps;

    double one = 1;
    double zero = one - one;
    double beta = 2;

    a = 1.38777878078144568e-17;
    for(;;) {
        temp = one + a;
        if (temp - one != zero)
            break;
        a = a * beta;
    }
    eps = a;

    printf("%e\n", eps);
}

它产生了记录的 2.22e-16。

请注意,它每次跳跃 2 倍——因此它实际上不会找到 1 + x 不是 1 的严格最小浮点。但它将在 2 的幂阶梯上找到最小的那个。

所以,我会说,严格来说文档并不十分准确,因为 0.75*eps + 1 != 10.75*eps < eps 确实如此。

关于r - .Machine$double.eps 比必要的大?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21068598/

10-13 07:31