该文档将 .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 != 1
和 0.75*eps < eps
确实如此。关于r - .Machine$double.eps 比必要的大?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21068598/