2010-11-02 9 views
5

Можно создать дубликат:
Numeric comparison difficulty in RПервый круг из R ад. 0,1 = 0,3/3

Здравствуйте все,

Согласно "R Inferno" бумаги. Я сейчас в первом круге R ада. Это где pagans ожидают 0.1 == 0.3/3. В документе рекомендуется использовать функцию all.equal для таких случаев, однако мне нужно проверить «> =» или «< =». При текущем примере из них не удалось:

> .1 >= .3/3 
[1] TRUE 
> .1 <= .3/3 
[1] FALSE 

Есть ли аналогичная функция для all.equal, которая проверяет неравенства?

Спасибо,

Илья

+3

Это не особая ошибка R, а общая ошибка, вызванная двоичным представлением чисел с плавающей запятой. См. Например, http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems. – schnaader

+0

Я знаю, почему возникает ошибка. Я хотел бы знать, есть ли функция R, которая может проверять неравенства, или мне нужно написать один с учетом плавающих точек. – ilya

+0

да, мне нужно делать более качественные поиски – ilya

ответ

7

Смотрите на эти вопросы:

Вообще говоря, вы можете иметь дело с этим, в том числе уровень толерантности, как на второй ссылке выше.

+0

См. Вторую ссылку, которая напрямую отвечает на вопрос. – Shane

+0

Спасибо, Шейн, во второй ссылке я нашел ваше сообщение с созданием нового оператора - именно то, что я хотел. Спасибо!! – ilya

+0

@ilya Рад, что мы сможем помочь! – Shane

4

Пожалуйста, смотрите R FAQ entry Why doesn't R think these numbers are equal и ссылки в нем.

+1

Это увлекательный, но не ответ на ОП. – mob

+3

Несомненно, или вы читаете другую запись 7.31. В примере есть «sqrt (2) * sqrt (2) == 2» выходит как FALSE и здесь такая же проблема: представление чисел с плавающей запятой. –

2

Вы пытались бы разумно использовать команду zapsmall(), которая, кажется, дает поведение, которое вы ищите. Я не знаю, работает ли это во всех ситуациях. например,

.1 >= zapsmall(.3/3) 
[1] TRUE 
> .1 <= zapsmall(.3/3) 
[1] TRUE 
8

Основным испытанием all.equal является ли abs(x-y) < tolerance для некоторых значений x и y и некоторые небольшие tolerance. Эквивалентные тесты на неравенство проверили бы:

x <= y:   x-y < tolerance 
x < y:   x-y < -tolerance 
x >= y:   x-y > -tolerance 
x > y:   x-y > tolerance