我正在阅读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(默认值)的数值比较.如果这小于容差或不是有限的,则使用绝对差异,否则相对差异按平均绝对差异缩放. …
我在学习java的时候,发现我们避免使用==比较引用类型,因为==比较的是引用是否相同,而不是内容。==由于它们在内存中的存储方式,我们只会用于原始类型。
我在关系运算符的 R 文档中发现了一个类似的注释:
不要将 == 和 != 用于测试,例如在 if 表达式中,您必须获得单个 TRUE 或 FALSE。除非您绝对确定不会发生任何异常,否则您应该使用相同的函数。
紧接着,我发现:
对于数值和复数值,请记住 == 和 != 不允许分数的有限表示,也不允许舍入误差。使用 all.equal 和 same 几乎总是可取的。
我谦虚的问题:
1.我们讨论 R 中的原始类型吗?如果有,它们是什么?我们可以总是安全地使用关系运算符来比较它们吗?(此外,在使用关系运算符时,在什么情况下我们可以“绝对确定不会发生任何异常”?)
2.我==多次看到 R 代码比较字符串(字符),我看到的那些 R 代码是草率的还是因为字符/字符串是 R 中的原始类型(或者我们总是可以使用关系运算符进行比较的东西)?
[更新]
感谢下面的评论,我意识到上面的引用主要是想强调 R 运算的向量化特征而不是输出的准确性,并且(基础)R 中的关系运算的有效性不太可能受到影响通过与引用类型相关的问题。
热忱欢迎任何进一步解释/澄清的答案或评论。
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) 我有一个整数向量vec1,我正在使用dist函数生成一个远程矩阵。我想获取距离矩阵中某个值的元素的坐标(行和列)。本质上,我想获得相距 d 距离的一对元素。例如:
vec1 <- c(2,3,6,12,17)
distMatrix <- dist(vec1)
# 1 2 3 4
#2 1
#3 4 3
#4 10 9 6
#5 15 14 11 5
Run Code Online (Sandbox Code Playgroud)
说,我对向量中相距 5 个单位的一对元素感兴趣。我想得到坐标 1 是行和坐标 2 是距离矩阵的列。在这个玩具示例中,我希望
coord1
# [1] 5
coord2
# [1] 4
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种有效的方法来获取这些值而不涉及将dist对象转换为矩阵或遍历矩阵?
最近有一些新闻关于发现三个总计为42的立方体。即,安德鲁·萨瑟兰德和安德鲁·布克发现(-80538738812075974)^ 3 + 80435758145817515 ^ 3 + 12602123297335631 ^ 3 = 42(https://math.mit。 edu /〜drew /)
我对此进行了一些修改,但在R中没有得到42。
我确实在其他地方得到了它(WolframAlpha),但是R给了我这个:
> (-80538738812075974)^3 + 80435758145817515^3 + 12602123297335631^3
[1] 1.992544e+35
Run Code Online (Sandbox Code Playgroud)
知道我在做什么错吗?R中是否存在大量限制?还是我(很可能)只是在做一些愚蠢的事情?
我想知道为什么as.character(5.0)返回5但as.character(5.1)返回5.1R。我试图通过阅读文档获得答案,但没有运气。
我知道以前有人问过类似的问题,但是我找不到一种方法可以将因子转换为数字而不丢失任何小数。
这里有一个简单的例子:
我的向量是这样的:
january$pickup_latitude[1] = 40.751231
Run Code Online (Sandbox Code Playgroud)
做完之后:
as.numeric(as.character(january$pickup_latitude))
Run Code Online (Sandbox Code Playgroud)
结果是:
january$pickup_latitude[1] = 40.75123
Run Code Online (Sandbox Code Playgroud)
即使每种情况都有不同的长度,有什么方法可以保留所有小数?
在 R 中编写以下代码时:
seq1 <- seq(from = 0.05, to = 0.5, by = 0.05)
Run Code Online (Sandbox Code Playgroud)
然后运行以下代码:
seq1 == 0.15
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
理想情况下,我应该得到:
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我说:
seq1 == (0.1+0.05)
Run Code Online (Sandbox Code Playgroud)
然后我得到所需的输出:
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?
我正在做一个十进制数相乘并将其转换为整数的简单操作,但结果似乎与预期不同。抱歉,如果在其他地方对此进行了讨论,我无法找到任何直接的答案
> as.integer(1190.60 * 100)
[1] 119059
Run Code Online (Sandbox Code Playgroud)
编辑: 所以,我必须将其转换为字符,然后执行 as.integer 以获得预期的结果
> temp <- 1190.60
> temp2 <- 1190.60 * 100
> class(temp)
[1] "numeric"
> class(temp2)
[1] "numeric"
> as.character(temp2)
[1] "119060"
> as.integer(temp2)
[1] 119059
> as.integer(as.character(temp2))
[1] 119060
Run Code Online (Sandbox Code Playgroud)
EDIT2:根据评论,感谢@andrey-shabalin
> temp2
[1] 119060
> as.integer(temp2)
[1] 119059
> as.integer(round(temp2))
[1] 119060
Run Code Online (Sandbox Code Playgroud)
EDIT3:正如评论中提到的,问题与 as.integer 的行为有关,而不是关于浮动计算
所以我对 R 还很陌生,我正在阅读 R for Data Science(2e) 这本书。
我从书中复制了下面所示的代码,它返回了不同的输出。我不知道为什么
书上的代码
x <- c(1 / 49 * 49, sqrt(2) ^ 2)
x
#> [1] 1 2
print(x, digits = 16)
#> [1] 0.9999999999999999 2.0000000000000004
Run Code Online (Sandbox Code Playgroud)
我的代码
print(sqrt(2)^2, digits = 16)
#[1] 2
#then tried saving it to an object, same output
sq_2 <- sqrt(2)^2
print(sq_2, digits = 16)
#[1] 2
Run Code Online (Sandbox Code Playgroud)
我还尝试将其保存为向量(单个项目),相同的输出
注意:问题是与类似代码的近似值不同。