0

我将使用以下代码在 R 中v0.0to生成一个向量。 然而,只去。1.0
v0.99

> s <- 0.0; v <- numeric();
> while ( s <= 1 ){
+    v <- append(v, s)
+    s <- s + 0.01
+ }
> v
  [1] 0.00 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14
 [16] 0.15 0.16 0.17 0.18 0.19 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29
 [31] 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44
 [46] 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59
 [61] 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74
 [76] 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89
 [91] 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99
>

所以我看一下swhile循环中的逻辑。
我发现了一些神秘的东西...

> s <= 1
[1] FALSE
> s == 1
[1] FALSE
> s
[1] 1

假设s应该是1.01,但它只是去1......
所以我们知道s1,但为什么它不等于1

(我是 R 新手,很抱歉提出愚蠢的问题。)

4

2 回答 2

2

为什么不使用内置的 R 函数seq

> seq(0,1,.01)
  [1] 0.00 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14
 [16] 0.15 0.16 0.17 0.18 0.19 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29
 [31] 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44
 [46] 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59
 [61] 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74
 [76] 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89
 [91] 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00

你得到的原因FALSEs<= 1因为你试图将整数与浮点数进行比较。浮点数本质上是 不精确的,并且会使相等比较变得困难。

在您的特定情况下,将 final 添加.01s足以使其超过 1 的程度,导致您的循环在您预期之前终止一次迭代。

这是将 R 的内置函数用于此类事情的好习惯的部分原因,因为它们会为您处理极端情况(并且在大多数情况下也会更快。)

于 2013-03-25T20:41:36.853 回答
1

当您尝试将浮点值与非常精确的小数进行比较时,这种现象经常发生。

在您的情况下,您尝试比较 1,实际上它比 1 大一点。因此,当您尝试与 s<=1 进行比较时,总是错误的。

在此处查看有关浮点错误的更多信息

于 2013-03-25T20:44:09.970 回答