我错过了基础包中的东西或错误吗?
我正在 R-2.15.2,在Win 7-32
上运行x %% y模量(x mod y)5 %% 2是1
> 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
答案 0 :(得分: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
。< / p>
还有许多其他类似的陷阱与浮点运算的属性有关(不仅仅是在R中)。关于这一主题的经典论文是What Every Computer Scientist Should Know About Floating-Point Arithmetic。