为什么要在is.wholenumber中使用此公差
为什么要在is.wholenumber中使用此公差,r,R,?is.integer的帮助页面上有一个关于函数的注释,该函数将告诉我们值是否为整数: is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol 但是,它并不完美: > 1.00000005 [1] 1 > is.wholenumber(1.00000005) [1] FALSE 下面的评论中有一个更好的论点:sqrt(eps)可能是对浮点运算引起的
?is.integer
的帮助页面上有一个关于函数的注释,该函数将告诉我们值是否为整数:
is.wholenumber <-
function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol
但是,它并不完美:
> 1.00000005
[1] 1
> is.wholenumber(1.00000005)
[1] FALSE
下面的评论中有一个更好的论点:sqrt(eps)
可能是对浮点运算引起的舍入误差的(粗略)估计 比较
> is.wholenumber(0.6/0.2, tol=0)
[1] FALSE
> is.wholenumber(0.6/0.2)
[1] TRUE
虽然实际上3==0.6/0.3
,但在浮点表示中并非如此
从“==”
对于数值和复数值,请记住“==”和“!=”不要
允许分数的有限表示,也不允许四舍五入
错误。使用'all.equal'和'idential'几乎总是
更好
的默认公差为。wholenumber
设置为与all.equal
中相同的数值:
## S3 method for class 'numeric'
all.equal(target, current,
tolerance = .Machine$double.eps ^ 0.5, scale = NULL,
..., check.attributes = TRUE)
这意味着的默认行为是.wholenumber
与
isTRUE(all.equal(0,abs(x - round(x))))
以我们的例子为例
> x <- 0.6/0.2
> x
[1] 3
> round(x)
[1] 3
> x == round(x)
[1] FALSE
> isTRUE(all.equal(0,x-round(x)))
[1] TRUE
> isTRUE(all.equal(0,x-round(x), tol=0))
[1] FALSE
>x
[1] 3
>圆形(x)
[1] 3
>x==圆形(x)
[1] 假的
>isTRUE(全部相等(0,x轮(x)))
[1] 真的
>isTRUE(全部相等(0,x轮(x),tol=0))
[1] 假的
它与打印无关。这大概是双浮点运算的精度。有人投票结束了这个问题。你能解释一下原因吗?谢谢(渴望知道我违反了什么规则)。@JoshuaUlrich谢谢。这实际上是有道理的。选民们似乎认为这个问题“主要是基于意见的”。当然错了。在我看来,这些投票比我的问题更“主要是基于意见”。
> x <- 0.6/0.2
> x
[1] 3
> round(x)
[1] 3
> x == round(x)
[1] FALSE
> isTRUE(all.equal(0,x-round(x)))
[1] TRUE
> isTRUE(all.equal(0,x-round(x), tol=0))
[1] FALSE