该文档描述.Machine$double.eps为最小的正浮点数x1 + x != 1.所以我希望以下产生1:
options(digits=17)
1 + .Machine$double.eps
# [1] 1.0000000000000002
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.似乎我必须尽可能低到0.5*.Machine$double.eps达到预期的四舍五入之前.我误解了一些事情.Machine$double.eps吗?这个平台依赖吗?(下面的sessionInfo())
> 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
Run Code Online (Sandbox Code Playgroud)
谢谢
仅仅因为它很有趣,这里是代码R用来计算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);
}
Run Code Online (Sandbox Code Playgroud)
据记载,它产生2.22e-16.
请注意,它由2倍,每次跳-所以它不是真正要找到严格的最小浮动点1 + x不是1.但它会在2阶的权力阶梯中找到最小的一个.
所以,我要说的是,严格说来文件是不是很准确,因为它的确是真实的0.75*eps + 1 != 1和0.75*eps < eps.