以下代码显然是错误的.有什么问题?
i <- 0.1
i <- i + 0.05
i
## [1] 0.15
if(i==0.15) cat("i equals 0.15") else cat("i does not equal 0.15")
## i does not equal 0.15
Run Code Online (Sandbox Code Playgroud) 我正在阅读The R Inferno,并遇到了一些我不理解的事情.除了Inferno的第8.2.23节之外,还有一些关于比较浮点数的好问题:问题1,问题2.
但是,我仍在使用中遇到问题all.equal.使用默认值all.equal我得到的结果(大部分)正如我所料.
> all.equal(2,1.99999997)
[1] "Mean relative difference: 1.5e-08"
> all.equal(2,1.99999998) #I expected FALSE here
[1] TRUE
> all.equal(2,1.99999999)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
我不确定为什么在1.99999998函数会返回TRUE,但这与我指定容差级别的以下行为没有关系:
> all.equal(2,1.98,tolerance=0.01) #Behaves as expected
[1] "Mean relative difference: 0.01"
> all.equal(2,1.981,tolerance=0.01) #Does not behave as expected
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
此外,
> all.equal(2,1.980000000001,tolerance=0.01)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
但是如果我们计算:
> diff(c(1.981,2))
[1] 0.019
Run Code Online (Sandbox Code Playgroud)
显然,
> diff(c(1.981,2)) >= 0.01
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
那么,为什么all.equal无法区分2和1.981,容差为0.01?
编辑
从文档中:通过首先计算两个数值向量的平均绝对差值来完成scale = NULL(默认值)的数值比较.如果这小于容差或不是有限的,则使用绝对差异,否则相对差异按平均绝对差异缩放. …
v1 = c(2, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1,
2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21,
2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32,
2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4, 2.41, 2.42, 2.43,
2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5, 2.51, 2.52, 2.53, 2.54,
2.55, 2.56, 2.57, 2.58, 2.59, 2.6, 2.61, 2.62, 2.63, 2.64, 2.65,
2.66, 2.67, 2.68, 2.69, 2.7, 2.71, 2.72, 2.73, 2.74, 2.75, 2.76,
2.77, …Run Code Online (Sandbox Code Playgroud) 可能重复:
R中的数字比较难度
大家好,
根据"R Inferno"论文.我现在正处于R地狱的第一圈.这是异教徒期望0.1 == 0.3/3的地方.Paper建议all.equal在这种情况下使用函数,但是我需要检查"> ="或"<="条件.目前他们的例子失败了:
> .1 >= .3/3
[1] TRUE
> .1 <= .3/3
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
是否有类似于all.equal的函数来检查不等式?
谢谢,
伊利亚
考虑以下代码:
library(dplyr)
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
myf <- function(patientID, age, diabetes, status) { isTRUE(all.equal(age, 34))}
mutate(patientdata, isAge34 = myf(patientID, age, diabetes, status))
Run Code Online (Sandbox Code Playgroud)
我写信myf返回TRUEwhere 行age == 34,但这不起作用:
patientID age diabetes status isAge34
1 1 25 Type1 Poor FALSE
2 2 34 Type2 Improved FALSE
3 3 28 Type1 Excellent …Run Code Online (Sandbox Code Playgroud) 我试图使用 all 和 all.equal 来测试两个向量是否相等,但它们给出了不同的结果,我不确定为什么。
> x = seq(0,1,by=0.2)
> x
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> y = c(0.0, 0.2, 0.4, 0.6, 0.8, 1.0)
> all(x == y)
[1] FALSE
> all.equal(x, y)
[1] TRUE
Run Code Online (Sandbox Code Playgroud) 我正在运行下面的代码.函数Ax返回值1.但是ifelse语句不识别Ax == 1.
我已经尝试使函数的输出为双精度,所有数值都加倍.这没效果.
我希望:
1)帮助解决此特定情况
2)获取有关如何避免此问题的提示
Axfun<-function(beta,gamma,a,b,g,H0stud,Wh,Wi){
((b*beta + g*gamma)*(1 + 2*g*gamma)*(1 + gamma + b*((-beta)*(1 + gamma) + a*(-1 + beta)*(1 + g*gamma)))*H0stud*Wi)/
((-1 + b*beta)*(1 + gamma)*((-g)*gamma*(1 + 2*g*gamma)*Wi + b*beta*((-1 + g*gamma*(-2 + H0stud) + H0stud)*Wh - (1 + g*gamma)*H0stud*Wi)))
}
Ax<-Axfun(2^1,
2^0,
2^0,
2^-3,
2^-1,
1,
1,
0.4)
ifelse(Ax>=1, 0, Ax)
Run Code Online (Sandbox Code Playgroud)