我是R的新手,我有一个基本的额外疑问 假设
a <- 2.656779e-08
b <- 1
s < a+b
1
我想知道为什么我没有得到确切的价值。我是R的初学者
提前致谢
答案 0 :(得分:2)
总结以上评论:
[我自己]:
将一个非常小的浮点十进制数量添加到(相对)大得多的数字出现以返回不正确的值:
## default
R> options()["digits"]
# $digits
# [1] 7
##
a <- 2.656779e-08
b <- 1
##
R> a+b
# [1] 1
##
这实际上只与默认的打印/显示设置有关。然而,在内部,a+b
被准确地表示(即a+b != b == 1.0
)可能有十几种方法来证明这一点;这里有一些很快就会浮现在脑海中:
R> all.equal(a+b,1)
# [1] "Mean relative difference: 2.656779e-08"
##
R> (a+b)-1
# [1] 2.656779e-08
##
R> all.equal(a,(a+b)-1)
# [1] TRUE
##
options(digits=15)
R> a+b
# [1] 1.00000002656779
[@ Ben Bolker]:
我上面的第一个声明提出了一个重要的警告 - 如果您为all.equal(1, 1 + x)
越来越小的值测试x
,您将不可避免地越过此表达式返回TRUE
的阈值。正如本指出的那样,这个阈值出现在大约2e-16
。此外,我相信这一点与帮助文件?.Machine
:
double.eps
最小的正浮点数x,使得1 + x!= 1 如果double.base为2或者,则等于double.base ^ ulp.digits double.rounding为0;否则,它是(double.base ^ double.ulp.digits)/ 2.通常2.220446e-16。
[@ LauriK]:
尽管简单的1
似乎是integer
,但默认情况下,R会将此视为numeric
,除非您另行指定,例如:使用as.integer
,1L
等等...您可以使用b
验证示例中的对象integer
是否为class(b)
类对象,例如str(b)
或is.integer(b)
。