假设我想测试 'a' 是否小于或等于 'b' 当两者都是浮点数时。我会和
isTRUE(all.equal(a,b)) || a <= b
我想知道是否有比这更好的方法。
是否有类似于 all.equal 的函数,用于小于或等于(/大于等于)允许“接近相等”?
如果想要比较两个浮点数向量而不是单个数字,该怎么办?
更新 :@shadow 指向我 Numeric comparison difficulty in R
人们当然可以明确设置容差并避免 all.equal:
tol = 1e-5
# a equals b
abs(a-b) <= tol
# a less or equal to b
a <= b + tol
以下是关于绝对容差与相对容差的一些讨论:http://realtimecollisiondetection.net/blog/?p=89
我想和往常一样,没有“正确”的方法来实现这一点。
最佳答案
有趣的问题。我确信有更好的方法,但这个简单的函数采用两个 double
向量,如果它们在元素方面几乎相等( mode = "ae"
),则返回给定指定的容差。如果它们小于 ( mode = "lt"
) 或者它们几乎等于或小于 ( mode = "ne.lt"
),它也可以返回,以及它们的 "gt"
等价物...
near_equal <- function( x , y , tol = 1.5e-8 , mode = "ae" ){
ae <- mapply( function(x,y) isTRUE( all.equal( x , y , tolerance = tol ) ) , x , y )
gt <- x > y
lt <- x < y
if( mode == "ae" )
return( ae )
if( mode == "gt" )
return( gt )
if( mode == "lt" )
return( lt )
if( mode == "ne.gt" )
return( ae | gt )
if( mode == "ne.lt" )
return( ae | lt )
}
# And in action....
set.seed(1)
x <- 1:5
# [1] 1 2 3 4 5
y <- 1:5 + rnorm(5,sd=0.1)
# [1] 0.9373546 2.0183643 2.9164371 4.1595281 5.0329508
near_equal( x , y , tol = 0.05 , mode = "ae" )
#[1] FALSE TRUE TRUE TRUE TRUE
near_equal( x , y , tol = 0.05 , mode = "ne.gt" )
#[1] TRUE TRUE TRUE TRUE TRUE
希望有帮助。
关于r - R 中的浮点数小于或等于,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25154930/