请考虑以下代码:
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)
为什么会出现这些不准确之处?
关于浮点表示,已经向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)
对这些数字也没有任何限制.位置无限增加到左侧和右侧.
为什么有些数字在存储为浮点数时会失去准确性?
例如,十进制数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位内存中表达"太大" ?
我试图比较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中大于或等于比较的合理方法,因为>=它不能真正被信任?
也许是一个简单的问题,但我无法找到解决问题的好方法.像这样的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 源代码中,大多数(但不是全部)函数使用整数值作为常量:
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 在使用数字时会做正确的事情。然而,有时我们想显式地为常量创建一个整数值。
问题是关于良好实践和基本原理,而不是关于“L”符号本身、整数类和数字类之间的差异或比较数字。
可能重复:
为什么这些数字不相等?
0.9 == 1-0.1 >>> TRUE
0.9 == 1.1-0.2 >>> FALSE
Run Code Online (Sandbox Code Playgroud) 有人可以解释一下以下输出.我知道它与浮点精度有关,但是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) 我想知道找到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) 我写了一个(可能不是特别好!)函数来测试一个数字是否是整数:
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)中尝试了这个并重复了这个问题.我有兴趣知道:
r ×7
math ×2
precision ×2
comparison ×1
data.table ×1
function ×1
ieee-754 ×1
integer ×1
interactive ×1
numeric ×1
r-faq ×1
rounding ×1
xts ×1