假设我想测试 '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/

10-12 17:16