相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

为什么十进制数不能用二进制表示?

关于浮点表示,已经向SO发布了几个问题.例如,十进制数0.1没有精确的二进制表示,因此使用==运算符将其与另一个浮点数进行比较是危险的.我理解浮点表示的原理.

我不明白的是,从数学的角度来看,为什么小数点右边的数字比左边的数字更"特殊"?

例如,数字61.0具有精确的二进制表示,因为任何数字的整数部分始终是精确的.但数字6.10并不准确.我所做的只是将十进制移动到一个地方,然后我突然从Exactopia转到了Inexactville.在数学上,两个数字之间应该没有内在差异 - 它们只是数字.

相比之下,如果我将小数位移到另一个方向以产生数字610,我仍然在Exactopia中.我可以继续向那个方向前进(6100,610000000,610000000000000),它们仍然是精确,准确,准确的.但是一旦小数越过某个阈值,数字就不再精确了.

这是怎么回事?

编辑:为了澄清,我想远离关于行业标准表示的讨论,例如IEEE,并坚持我认为是数学上"纯粹"的方式.在基数10中,位置值为:

... 1000  100   10    1   1/10  1/100 ...
Run Code Online (Sandbox Code Playgroud)

在二进制文件中,它们将是:

... 8    4    2    1    1/2  1/4  1/8 ...
Run Code Online (Sandbox Code Playgroud)

对这些数字也没有任何限制.位置无限增加到左侧和右侧.

math floating-point

275
推荐指数
8
解决办法
9万
查看次数

为什么浮点数不准确?

为什么有些数字在存储为浮点数时会失去准确性?

例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,两者都可以用二进制(0b1011100/0b1010)精确表示.但是,存储为浮点数的相同比率永远不会完全等于9.2:

32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875
Run Code Online (Sandbox Code Playgroud)

这样一个看似简单的数字如何在64位内存中表达"太大" ?

language-agnostic floating-point precision

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

R中的数字比较难度

我试图比较R中的两个数字作为if语句条件的一部分:

(a-b) >= 0.5

在这个特定的例子中,a = 0.58和b = 0.08 ......但仍然(a-b) >= 0.5是假的.我知道使用==确切数字比较的危险,这似乎有关:

(a - b) == 0.5) 是假的,而

all.equal((a - b), 0.5) 是真的.

我能想到的唯一解决方案是有两个条件:(a-b) > 0.5 | all.equal((a-b), 0.5).这有效,但这真的是唯一的解决方案吗?我应该=永远地宣誓比较运营商的家庭吗?

为清晰起见编辑:我知道这是一个浮点问题.更重要的是,我要问的是:我该怎么做呢?什么是处理R中大于或等于比较的合理方法,因为>=它不能真正被信任?

floating-point comparison r comparison-operators r-faq

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

如何使用最小值或最大值提取行?

也许是一个简单的问题,但我无法找到解决问题的好方法.像这样的df:

        ID  Year    Temp    ph
1       P1  1996    11.3    6.80
2       P1  1996    9.7     6.90
3       P1  1997    9.8     7.10
...
2000    P2  1997    10.5    6.90
2001    P2  1997    9.9     7.00
2002    P2  1997    10.0    6.93
Run Code Online (Sandbox Code Playgroud)

如果我想知道我输入的最大值在哪里:

which.max(df$Temp)
Run Code Online (Sandbox Code Playgroud)

并且R打印行的索引,例如665.

所以,如果我想读取并提取包含所有相关值的列,我必须输入:

df[665,]
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来知道哪个ID与df的特定列的最大值相关?

r

22
推荐指数
3
解决办法
6万
查看次数

在 R 中使用整数值代替数值(例如 1L 与 1)作为常量的好处

在 R 源代码中,大多数(但不是全部)函数使用整数值作为常量:

colnames <- function(x, do.NULL = TRUE, prefix = "col")
{
    if(is.data.frame(x) && do.NULL)
    return(names(x))
    dn <- dimnames(x)
    if(!is.null(dn[[2L]]))
    dn[[2L]]
    else {
        nc <- NCOL(x)
    if(do.NULL) NULL
        else if(nc > 0L) paste0(prefix, seq_len(nc))
        else character()
    }
}
Run Code Online (Sandbox Code Playgroud)

R语言定义说:

在大多数情况下,整数和数值之间的差异并不重要,因为 R 在使用数字时会做正确的事情。然而,有时我们想显式地为常量创建一个整数值。

  • 在哪些情况下需要强制常量使用整数值而不是简单地使用数值?例如,例如 1 会失败,但例如 1L 不会失败的示例是受欢迎的。
  • 相反,在哪些情况下不需要使用整数值(例如交互式使用与编程、使用常量索引等)?

问题是关于良好实践和基本原理,而不是关于“L”符号本身整数类和数字类之间的差异比较数字

integer interactive r function numeric

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

10
推荐指数
2
解决办法
2859
查看次数

R中浮点精度的极值数值

有人可以解释一下以下输出.我知道它与浮点精度有关,但是magnitue(差异1e308)的顺序让我感到惊讶.

0:精度高

> 1e-324==0
[1] TRUE
> 1e-323==0
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

1:非常不高兴

> 1 - 1e-16 == 1
[1] FALSE
> 1 - 1e-17 == 1
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

floating-point precision r rounding ieee-754

10
推荐指数
2
解决办法
1万
查看次数

查找匹配行的最快方法

我想知道找到xts对象中与一个特定行相同的所有行的最快方法是什么

library(xts)

nRows <- 3

coreData <- data.frame(a=rnorm(nRows), b=rnorm(nRows), c=rnorm(nRows))

testXts1 <- xts(coreData, order.by=as.Date(1:nRows))
testXts2 <- xts(coreData, order.by=as.Date((nRows + 1):(2*nRows)))
testXts3 <- xts(coreData, order.by=as.Date((2*nRows + 1):(3*nRows)))

testXts <- rbind(testXts1, testXts2, testXts3)

> testXts
                    a         b         c
1970-01-02 -0.3288756  1.441799  1.321608
1970-01-03 -0.7105016  1.639239 -2.056861
1970-01-04  0.1138675 -1.782825 -1.081799
1970-01-05 -0.3288756  1.441799  1.321608
1970-01-06 -0.7105016  1.639239 -2.056861
1970-01-07  0.1138675 -1.782825 -1.081799
1970-01-08 -0.3288756  1.441799  1.321608
1970-01-09 -0.7105016  1.639239 -2.056861
1970-01-10  0.1138675 -1.782825 -1.081799

rowToSearch <- first(testXts)

> rowToSearch
                    a …
Run Code Online (Sandbox Code Playgroud)

r xts data.table

10
推荐指数
2
解决办法
949
查看次数

对整数进行反直观测试:63 =(45 x 1.4)= 62

我写了一个(可能不是特别好!)函数来测试一个数字是否是整数:

is.wholeNumber <- function(x) x == floor(x)
Run Code Online (Sandbox Code Playgroud)

一般来说,这个功能对我的目的来说很好,因为我真的只考虑我用一些判断位置测试数字的情况,所以我天真的理解是机器精度不应该是一个因素.

当我在45 x 1.4 = 63的情况下应用此功能时,我得到了

> is.wholeNumber( 45 * 1.4)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

这似乎是因为R的楼层功能没有像我期望的那样进行评估:

> floor(45 * 1.4)
[1] 62
Run Code Online (Sandbox Code Playgroud)

实际上应该是63.


在做一些阅读时,我遇到了这篇关于如何在R中编码的流行帖子.最高投票的答案提示了这个功能

is.wholeNumber <- function(x) ( x %% 1 ) == 0
Run Code Online (Sandbox Code Playgroud)

因为我得到了,这似乎在我的背景下似乎不起作用

> (45 * 1.4 ) %% 1
[1] 1
Run Code Online (Sandbox Code Playgroud)

第二个最受欢迎的帖子建议使用

is.wholeNumber <- function(x) all.equal(x, as.integer(x))
Run Code Online (Sandbox Code Playgroud)

虽然这不再起作用,但确实给出了意想不到的明显输出

> is.wholeNumber( 45 * 1.4)
[1] "Mean relative difference: 0.01587302"
Run Code Online (Sandbox Code Playgroud)

我现在已经在干净的R工作室工作区和R终端(R 3.4.2 Short Summer)中尝试了这个并重复了这个问题.我有兴趣知道:

  1. 人们可以在他们的机器上重现这个问题吗?
  2. 为什么我得到这个反直觉的结果?
  3. 解决这个问题的正确方法是什么?

r

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