【问题标题】:R basic addition with integer and decimalR基本加法与整数和小数
【发布时间】:2015-02-01 17:19:05
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

  • 值被正确存储,这与它的打印方式有关。尝试运行options(digits=15); a+b 并记录结果。
  • 虽然如果 a 是 a+1 将等于 1 ...
  • 只是一个额外的注释 - 你在那里添加了两位小数。或 R 中调用的数字。您可以通过尝试 str(b)class(b) 来查看它。如果你想制作一个整数,那么你必须在它的末尾添加“L”。 b &lt;- 1L 将导致 b 为整数。
  • 我不确定,这听起来像是一个完全独立的问题。您应该在一个新问题中提出这个问题。
  • @nrussell,作为答案发布...

标签: r addition


【解决方案1】:

总结以上cmets:


[我自己]:

将一个非常小的浮点小数添加到一个(相对)大得多的数字仅似乎返回一个不正确的值:

## 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 的阈值。正如 Ben 指出的那样,这个阈值大约出现在 2e-16 处。此外,我相信从帮助文件?.Machine 中截取的以下段落也反映了这一点:

double.eps

满足 1 + x != 1 的最小正浮点数 x。它 等于 double.base ^ ulp.digits 如果 double.base 为 2 或 double.rounding 为 0;否则,它是 (double.base ^ double.ulp.digits) / 2. 通常为 2.220446e-16。


[@LauriK]:

尽管一个简单的1 似乎是一个integer,R 将默认将其视为numeric,除非您另外指定,例如通过使用as.integer1L 等...您可以使用class(b)str(b)is.integer(b) 验证示例中的对象b 不是integer 类对象,例如例子。

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多