R基本加法与整数和小数

R basic addition with integer and decimal

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

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

我想知道为什么我没有得到准确的值。我是 R

的初学者

提前致谢

总结以上评论:


[我自己]:

将一个非常小的浮点小数加到一个(相对)大得多的数字上只会 出现 到 return 一个不正确的值:

## 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 值越来越小,你将不可避免地越过一个阈值,其中这个表达式 returns TRUE。正如 Ben 所指出的,这个阈值大约出现在 2e-16。此外,我相信这与从帮助文件 ?.Machine 中摘录的以下段落相呼应:

double.eps

the smallest positive floating-point number x such that 1 + x != 1. It equals double.base ^ ulp.digits if either double.base is 2 or double.rounding is 0; otherwise, it is (double.base ^ double.ulp.digits) / 2. Normally 2.220446e-16.


[@LauriK]:

尽管简单的 1 看起来是 integer,但 R 会默认将其视为 numeric,除非您另有说明,例如通过使用 as.integer1L 等...您可以使用 [= 验证示例中的对象 b 不是 integer class 对象例如,26=、str(b)is.integer(b)