1 %% 0.1 = 0.1和1 %% 0.2 = 0.2?

时间:2013-03-21 11:36:39

标签: r floating-point floating-accuracy

我错过了基础包中的东西或错误吗?

我正在 R-2.15.2,在Win 7-32

上运行
  

x %% y模量(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 x 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 个答案:

答案 0 :(得分:7)

首先,我无法使用在x86_64上运行的R版本2.15.1重现此内容。

如果这是您环境中发生的事情,这几乎肯定与使用二进制浮点算法无法准确表示0.10.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。< / p>

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