可能重复:
为什么这些数字不相等?
刚注意到R中的这个错误.我猜它是代表0.6的方式,但是谁知道到底发生了什么?
根据R:
0.3 %% 0.2 = 0.1
0.4 %% 0.2 = 0
0.5 %% 0.2 = 0.1
**0.6 %% 0.2 = 0.2**
0.7 %% 0.2 = 0.1
0.8 %% 0.2 = 0
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
有人可以帮我理解为什么-1 + 1 <> 0?
有人可以帮助我理解为什么我在内置函数consum(),我的函数ct()和Excel之间得到三个不同的值,当它们都在做同样的事情时?
现在,我很确定答案是一个"回合"问题,但我无法弄清楚这个问题的部分来自何处.我的意思是,这一切"看起来非常简单.
在R中,当我构建序列'a'然后运行cumsum(a)时,我没有像我期望的那样得到0的结果.如果我尝试使用函数计算相同的值,我也会得到不同的答案.最后,如果我尝试使用Excel计算相同的值,我会得到第三个答案.
这是我使用cumsum()得到的:
> a<- seq(-1, 1, by=.1)
> a
[1] -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3
[15] 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> cumsum(a)
[1] -1.000000e+00 -1.900000e+00 -2.700000e+00 -3.400000e+00 -4.000000e+00
[6] -4.500000e+00 -4.900000e+00 -5.200000e+00 -5.400000e+00 -5.500000e+00
[11] -5.500000e+00 -5.400000e+00 -5.200000e+00 -4.900000e+00 -4.500000e+00
[16] -4.000000e+00 -3.400000e+00 -2.700000e+00 -1.900000e+00 -1.000000e+00
[21] 1.110223e-15
Run Code Online (Sandbox Code Playgroud)
我写了一个快速函数来测试这个并期望得到相同的答案(或0),但我得到一个完全不同的答案.这是我的功能及其结果:
ct<- function(x){
result = 0
for(i in 1:length(x)){
cat(i, ": Result = …Run Code Online (Sandbox Code Playgroud) 我观察到了这个:
> class(x)
[1] "numeric"
> str(x)
num [1:2500] 1 1 1 1 1 1 1 1 1 1 ...
> table(x)
1
2500
> table(x == 1)
FALSE TRUE
299 2201
> all.equal(x, rep(1,length(x)))
[1] TRUE
> dput(x)
c(1, ..... 1) # all ones
Run Code Online (Sandbox Code Playgroud)
这怎么可能?我理解浮点数不应该==在一般情况下进行比较,但是应该table不一致==?
PS.显然,table是与之一致,all.equal而不是==因为它首先将其参数转换为因子(即字符串).
PPS.table(x-1)显示非0值.
考虑以下代码:
library(dplyr)
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
myf <- function(patientID, age, diabetes, status) { isTRUE(all.equal(age, 34))}
mutate(patientdata, isAge34 = myf(patientID, age, diabetes, status))
Run Code Online (Sandbox Code Playgroud)
我写信myf返回TRUEwhere 行age == 34,但这不起作用:
patientID age diabetes status isAge34
1 1 25 Type1 Poor FALSE
2 2 34 Type2 Improved FALSE
3 3 28 Type1 Excellent …Run Code Online (Sandbox Code Playgroud) 我试图使用 all 和 all.equal 来测试两个向量是否相等,但它们给出了不同的结果,我不确定为什么。
> x = seq(0,1,by=0.2)
> x
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> y = c(0.0, 0.2, 0.4, 0.6, 0.8, 1.0)
> all(x == y)
[1] FALSE
> all.equal(x, y)
[1] TRUE
Run Code Online (Sandbox Code Playgroud) 考虑以下R函数
is.sqrt <- function(x, y){
if(x^2 == y) TRUE
else FALSE
}
Run Code Online (Sandbox Code Playgroud)
它回答x是y的平方根.如果y是一个完美的正方形,则函数的行为与预期一致 - is.sqrt(2,4)返回TRUE,is.sqrt(3,4)返回FALSE.如果y不是完美的正方形,则会出现问题.例如,
is.sqrt(sqrt(2), 2)
Run Code Online (Sandbox Code Playgroud)
返回FALSE.通过计算可以看出其原因
sqrt(2)^2 - 2
Run Code Online (Sandbox Code Playgroud)
返回4.440892e-16.我对如何解决这个问题的第一个想法是在将它与y进行比较之前对x ^ 2进行舍入但是多少是合适的?这甚至是推荐的方式吗?R中是否有标准方法来处理浮点精度?
我正在寻找一种方法来始终忽略 R 中浮点数之间的微小差异(根据 IEC 60559,这些是双精度浮点数),通过使用基础 R 工具而不使用 C 或 C++。换句话说,我想“舍入”双精度浮点数的有效数部分,这样像这样的东西返回 TRUE 而不是 FALSE:
1.45 - .55 == 2.45 - 1.55
## [1] FALSE
Run Code Online (Sandbox Code Playgroud)
就像是:
round_significand(1.45 - .55, bits=48) == round_significand(2.45 - 1.55, bits=48)
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
一个简单的方法round不起作用,因为我们需要四舍五入的级别取决于数字的大小。
data.table在内部做一些类似的事情,从?setNumericRounding:
计算机无法使用基数 2 精确表示某些浮点数(例如 0.6)。这会导致在连接或分组“数字”类型的列时出现意外行为;即“双倍”,请参见下面的示例。在不希望出现这种情况的情况下,data.table 允许将此类数据四舍五入到大约 11 sf,这在许多情况下是足够的数字。这是通过舍入有效数的最后 2 个字节来实现的。其他可能的值是 1 字节舍入或不舍入(全精度,默认值)。
我正在研究一个 hack 实现,它将所有内容缩放为一个十进制数x,floor(log10(x)) == 1并且四舍五入,例如:
rnd_sig <- function(x, precision=10) {
exp <- floor(log10(abs(x)))
round(x * 10 ^ (-exp), precision) / 10 ^ …Run Code Online (Sandbox Code Playgroud) 所以,我只是在手动计算eR中的值,我发现有些东西对我来说有点令人不安.
e使用R exp()命令的价值......
exp(1)
#[1] 2.718282
Run Code Online (Sandbox Code Playgroud)
现在,我将尝试使用手动计算它 x = 10000
x <- 10000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.718146
Run Code Online (Sandbox Code Playgroud)
不完全,但我们会尝试更接近使用 x = 100000
x <- 100000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.718268
Run Code Online (Sandbox Code Playgroud)
温暖但有点偏......
x <- 1000000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.71828
Run Code Online (Sandbox Code Playgroud)
现在,让我们尝试一个巨大的
x <- 5000000000000000
y <- (1 + (1 / x)) ^ x
y
#[1] 3.035035 …Run Code Online (Sandbox Code Playgroud) 我根据坐标绘制 x 和 y,颜色是第三个连续变量,具有 6 位小数。
ggplot(data, aes(x=x, y=y, color=continuous_variable)) +
geom_point()
Run Code Online (Sandbox Code Playgroud)
目前,颜色正在基于 3 位小数创建渐变,但我希望它显示 5。
有没有办法增加 ggplot 用于创建渐变的小数位数?
z = 3
N = 45
theta = 0.014
pbinom(z, N, theta, lower.tail = FALSE)
sum(dbinom(z:N, N, theta))
Run Code Online (Sandbox Code Playgroud)
我期望这两个表达式都返回上尾部区域 P(x >= 3)。