R基本加法,带整数和小数

时间:2015-02-01 17:19:05

标签: r addition

我是R的新手,我有一个基本的额外疑问 假设

a <- 2.656779e-08
b <- 1
s < a+b
1

我想知道为什么我没有得到确切的价值。我是R的初学者

提前致谢

1 个答案:

答案 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.integer1L等等...您可以使用b验证示例中的对象integer是否为class(b)类对象,例如str(b)is.integer(b)