相关疑难解决方法(0)

为什么这些数字不相等?

以下代码显然是错误的.有什么问题?

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)

floating-point r floating-accuracy r-faq

263
推荐指数
4
解决办法
4万
查看次数

检查数字是否为整数

我很惊讶地发现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)

我的方法会在哪里失败?如果你穿着我的假想鞋,你的工作会是什么?

integer r rounding

92
推荐指数
7
解决办法
11万
查看次数

如何返回R中的小数位数

我在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

18
推荐指数
3
解决办法
2万
查看次数

加法和减法后浮点数小于等于

在一系列浮点算术运算之后,是否存在一个"最佳实践",而不是与浮点数相等的比较?

我在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

1
推荐指数
1
解决办法
104
查看次数