2013-03-21 121 views
2

我是否缺少基础包中的东西或错误?1 %% 0.1 = 0.1 AND 1 %% 0.2 = 0.2?

我上R-2.15.2运行,在Win 7-32

X %%Ý模量(在x mod y)的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_。 – 2013-03-21 11:39:17

回答

7

首先,我不能使用在x86_64上运行的R版本2.15.1来重现这一点。

如果这是在你的环境中会发生什么,这几乎可以肯定是与事实既不0.1也不0.2可以准确地使用二进制浮点运算表示要做到:

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

%%的文档具有下面要说:

%%x %/% y可用于非整数y,例如1 %/% 0.2,但结果会受到表示错误的影响,因此可能与平台有关。因为0.2的IEC 60059表示是比0.2略大的二进制分数,所以对1 %/% 0.2的回答应该是4,但大多数平台给出5

还有许多其他类似的陷阱与浮点运算的属性(不只是在R中)有关​​。关于这个问题的经典论文是What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

(+1)为优秀的链接。我将不得不收藏这本书,因为这种东西经常在R标签下出现在这里。 – Arun 2013-03-21 12:12:23

+0

(+1)为链接和答案。但是我无法达到%%文档。 – guneysus 2013-03-21 12:21:26

+1

@guneysus:试试'?'%%'' – NPE 2013-03-21 12:26:17