2013-03-25 3 views
0

Я собираюсь создать вектор v от 0.0 до 1.0 в R, используя следующий код.
Однако v относится только к 0.99.Проблемы с петлями в R

> 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 
> 

Так я смотрю на s и логику в то время цикла.
я обнаружил, что-то таинственности ...

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

Предполагается, что s должен быть 1.01, но это идет только 1 ...
Итак, мы знаем s является 1, но почему она не равна 1?

(Я новичок в R, извините за вопрос глупый вопрос.)

+0

Причина 'ы <= 1 'и' s == 1 'сбой происходит из-за ошибки с плавающей точкой. – Justin

+1

Снимая часто задаваемые вопросы, часто стоит потратить время: http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f –

ответ

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 

Причина вы получаете FALSE для s<= 1 потому, что вы пытаетесь сравнить целое число в число с плавающей точкой. Числа с плавающей запятой - inherentlyimprecise, что затруднит сравнение сравнений.

В вашем конкретном случае добавление окончательного .01 в s натолкнуло его на достаточное количество, чтобы его было чуть больше 1, в результате чего ваш цикл завершил одну итерацию до того, как вы ожидали.

Это одна из причин, что это хорошая привычка использовать R встроенные функции для таких вещей, как они будут рассматривать дела угловые для вас (а также будет быстрее в большинстве случаев.)

+0

Поскольку я не полностью знаком с R, поэтому я создаю его самостоятельно: P –

+1

Чтение через «Введение в R» (http://cran.r-project.org/doc/manuals/R-intro.html) может помочь вам. Определенно используйте 'seq' для этого. – Wilduck

+0

Но можете ли вы объяснить, почему 's <= 1' является' FALSE'? –

1

Это явление часто возникает, когда вы пытаетесь сравнить значение поплавка с очень точными десятичными знаками.

В вашем случае вы пытаетесь сравнить 1, на самом деле оно больше 1 немного. Итак, когда вы пытаетесь сравнить с s < = 1, всегда ложь.

See more information of floating point errors here

Смежные вопросы