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.integer
、1L
等...您可以使用 [= 验证示例中的对象 b
不是 integer
class 对象例如,26=、str(b)
或 is.integer(b)
。
我是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.integer
、1L
等...您可以使用 [= 验证示例中的对象 b
不是 integer
class 对象例如,26=、str(b)
或 is.integer(b)
。