为了账号安全,请及时绑定邮箱和手机立即绑定

R中的数字比较难度

R中的数字比较难度

至尊宝的传说 2019-12-02 08:04:34
R中的数字比较难度我试图比较R中的两个数字作为if语句条件的一部分:(a-b) >= 0.5在这个特定的例子中,a = 0.58和b = 0.08 ......但仍然(a-b) >= 0.5是假的。我知道使用==确切数字比较的危险,这似乎有关:(a - b) == 0.5) 是假的,而all.equal((a - b), 0.5) 是真的。我能想到的唯一解决方案是有两个条件:(a-b) > 0.5 | all.equal((a-b), 0.5)。这有效,但这真的是唯一的解决方案吗?我应该=永远宣誓比较运营商的家庭吗?为清晰起见编辑:我知道这是一个浮点问题。更重要的是,我要问的是:我该怎么做呢?什么是处理R中大于或等于比较的合理方法,因为>=它不能真正被信任?
查看完整描述

3 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

我从来都不喜欢all.equal这样的事情。在我看来,宽容有时会以神秘的方式起作用。为什么不检查大于公差小于0.05的东西

tol = 1e-5(a-b) >= (0.05-tol)

一般来说,没有舍入和只有传统的逻辑,我发现直接逻辑比all.equal更好

如果x == y那么x-y == 0x-y对于我使用的这种情况,也许不完全是0

abs(x-y) <= tol

无论如何你必须设置公差all.equal,这比它更紧凑和简单all.equal



查看完整回答
反对 回复 2019-12-03
?
忽然笑

TA贡献1806条经验 获得超5个赞

如果要经常使用此方法,可以将其创建为单独的运算符或覆盖原始的> =函数(可能不是一个好主意):


# using a tolerance

epsilon <- 1e-10 # set this as a global setting

`%>=%` <- function(x, y) (x + epsilon > y)


# as a new operator with the original approach

`%>=%` <- function(x, y) (all.equal(x, y)==TRUE | (x > y))


# overwriting R's version (not advised)

`>=` <- function(x, y) (isTRUE(all.equal(x, y)) | (x > y))


> (a-b) >= 0.5

[1] TRUE

> c(1,3,5) >= 2:4

[1] FALSE FALSE  TRUE



查看完整回答
反对 回复 2019-12-03
?
HUWWW

TA贡献1874条经验 获得超12个赞

为了完整起见,我会指出,在某些情况下,你可以简单地舍入到几个小数位(与之前发布的更好的解决方案相比,这是一种蹩脚的解决方案。)

round(0.58 - 0.08, 2) == 0.5


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 604 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信