为什么要在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