数字比较

基本类型 / 数字 / Double 和 Float

a <- 1.0
b <- (0.3 * 3) + 0.1

# Wrong way to compare
is_equal1 <- a == b
# is_equal1 = FALSE

# Correct way: relative tolerance, 1.5e-08
is_equal2 <- isTRUE(all.equal(a, b))
# is_equal2 = TRUE

# Near zero the difference is absolute
is_equal3 <- isTRUE(all.equal(0, 1e-12))
# is_equal3 = TRUE

# A looser tolerance
is_equal4 <- isTRUE(all.equal(1, 1.001,
                              tolerance = 1e-2))
# is_equal4 = TRUE

# Trap: a text, not FALSE, hence isTRUE() above
difference <- all.equal(1, 1.1)
# difference = Mean relative difference: 0.1

cat("a =", a, "\n")
cat("b =", format(b, digits = 16), "\n")
cat("is_equal1 =", is_equal1, "\n")
cat("is_equal2 =", is_equal2, "\n")
cat("is_equal3 =", is_equal3, "\n")
cat("is_equal4 =", is_equal4, "\n")
cat("difference =", difference, "\n")