以下代码显然是错误的.有什么问题?
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) 我很惊讶地发现R没有附带一个方便的函数来检查数字是否为整数.
is.integer(66) # FALSE
Run Code Online (Sandbox Code Playgroud)
在帮助文件警告:
is.integer(x)不测试是否x包含整数!为此,请使用round,如is.wholenumber(x)示例中的函数 .
该示例将此自定义函数作为"解决方法"
is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol
is.wholenumber(1) # is TRUE
Run Code Online (Sandbox Code Playgroud)
如果我必须编写一个函数来检查整数,假设我没有阅读上面的注释,我会编写一个函数,它会像
check.integer <- function(x) {
x == round(x)
}
Run Code Online (Sandbox Code Playgroud)
我的方法会在哪里失败?如果你穿着我的假想鞋,你的工作会是什么?
我在R.工作.我有十进制度的一系列坐标,我想按这些数字的小数位数排序这些坐标(即我想丢弃小数位数太少的坐标).
R中是否有一个函数可以返回一个数字所具有的小数位数,我可以将其合并到函数编写中?
输入示例:
AniSom4 -17.23300000 -65.81700
AniSom5 -18.15000000 -63.86700
AniSom6 1.42444444 -75.86972
AniSom7 2.41700000 -76.81700
AniLac9 8.6000000 -71.15000
AniLac5 -0.4000000 -78.00000
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会编写一个废弃AniLac9和AniLac 5的脚本,因为这些坐标没有以足够的精度记录.我想丢弃经度和纬度都少于3个非零十进制值的坐标.
在一系列浮点算术运算之后,是否存在一个"最佳实践",而不是与浮点数相等的比较?
我在R中有以下示例,但该问题不仅适用于R,而且适用于使用浮点的任何语言.我有一个双x = 1,我应用了一系列的加法和减法.最后x应该是一个但不是由于浮点运算(从我收集的).这是一个例子
> stop_times <- seq(0.25, 2, by = .25)
> expr <- expression(replicate(100,{
x <- 1
for(i in 1:10) {
tmp <- rexp(1, 1)
n <- sample.int(1e2, 1)
delta <- tmp / n
for(j in 1:n)
x <- x - delta
x <- x + tmp
}
# "correct" answer is 4
which.max(x <= stop_times)
}))
> eval(expr)
[1] 5 5 5 4 4 4 5 5 5 4 5 4 4 4 …Run Code Online (Sandbox Code Playgroud) floating-point r floating-accuracy epsilon inexact-arithmetic