2013-03-21 3 views
2

Я пропускаю вещь или ошибку в базовом пакете?1 %% 0,1 = 0,1 И 1 %% 0,2 = 0,2?

Я бегу на R-2.15.2, на Win 7-32

х %% у модуля (х мод у) 5 %% 2 1

от: http://www.statmethods.net/management/operators.html


> 1 %% 0.1 
[1] 0.1 

> 1 %% 0.2 
[1] 0.2 

Оба они должны быть равны 0.

Нижеприведенные примеры работают так, как ожидалось. Например:

1 %% 0,15

должна быть 0,1 (1,0 = 6 х 0,15 + 0,1)


> 1 %% 0.11 # expected result 
[1] 0.01 

> 1 %% 0.15 
[1] 0.1 

> 1 %% 0.3 
[1] 0.1 

> 1 %% 0.4 
[1] 0.2 

> 1 %% 0.5 
[1] 0 
+1

Вы должны включить _explanation_ вашего ожидаемого результата в свой вопрос. –

ответ

7

Прежде всего, не могу воспроизведите это, используя R версии 2.15.1, запущенную на x86_64.

Если это то, что происходит в вашей среде, это почти наверняка связан с тем, что ни 0.1, ни 0.2 может быть представлены точно в двоичную арифметику с плавающей точкой:

> sprintf("%.20f", 0.1) 
[1] "0.10000000000000000555" 
> sprintf("%.20f", 0.2) 
[1] "0.20000000000000001110" 

документация для %% имеет сказать следующее:

%% и x %/% y могут быть использованы для нецелых y, например, 1 %/% 0.2, но результаты подвержены ошибкам представления и поэтому могут быть зависимыми от платформы. Поскольку представление IEC 60059 0.2 представляет собой двоичную фракцию, немного большую, чем 0.2, ответ 1 %/% 0.2 должен быть 4, но большинство платформ дают 5.

Существует много других подобных ошибок, связанных со свойствами арифметики с плавающей запятой (не только в R). Классическая бумага по теме: What Every Computer Scientist Should Know About Floating-Point Arithmetic.

+0

(+1) за отличную ссылку. Мне нужно будет добавить это в закладки, так как этот материал часто появляется здесь на SO под тегом R. – Arun

+0

(+1) за ссылку и ответ. Но я не могу получить документацию %%. – guneysus

+1

@guneysus: Попробуйте '? '%%'' – NPE

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