Неверный логический возврат для простой последовательности - PullRequest
1 голос
/ 15 октября 2011

Вот некоторый основной код и его вывод. Я действительно не могу сказать ничего, кроме логического теста для последовательности, содержащей 1.2, которая дает неточный результат. Это работает для многих других значений.

# Incorrect
> seq(0.5, 1.5, by=0.05) == 1.2
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

# Correct
> seq(0.5, 1.5, by=0.05) == 1.15
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

# Correct
> seq(0.5, 1.5, by=0.05) == 1.25
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

# Correct
> seq(0.5, 1.5, by=0.05) == 1.3
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

Я попытался протестировать все значения, используя следующее, которое не воспроизводит ошибку:

> sapply(seq(0.5, 1.5, by=0.05), function(x){sum(seq(0.5, 1.5, by=0.05) == x)})
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Я использую версию R 2.13.2 (2011-09-30), платформа: x86_64-pc-linux-gnu (64-разрядная версия).

1 Ответ

4 голосов
/ 15 октября 2011

Вы можете продублировать все, что делает all.equal, написав собственную функцию сравнения:

is.nearenough=function(x,y,tol=.Machine$double.eps^0.5){
  abs(x-y)<tol
}

, затем вы можете указать, какой (is.nearenough (s, 1.2)) где s - ваша последовательность,Возможно, вам придется настроить допуск для вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...