gun*_*sus 2 floating-point r floating-accuracy
我错过了基础包中的东西或错误吗?
我在Win 7-32上运行R-2.15.2
x %% y模数(x mod y)5 %% 2是1
> 1 %% 0.1
[1] 0.1
> 1 %% 0.2
[1] 0.2
Run Code Online (Sandbox Code Playgroud)
它们都必须为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
Run Code Online (Sandbox Code Playgroud)
首先,我无法使用在x86_64上运行的R版本2.15.1重现这一点.
如果这是你的环境中发生的事情,这几乎肯定与使用二进制浮点算法既0.1
不能0.2
完全表示的事实有关:
> sprintf("%.20f", 0.1)
[1] "0.10000000000000000555"
> sprintf("%.20f", 0.2)
[1] "0.20000000000000001110"
Run Code Online (Sandbox Code Playgroud)
该文档%%
有以下说法:
%%
并且x %/% y
可以用于非整数y
,例如1 %/% 0.2
,但结果受到表示错误的影响,因此可能与平台有关.因为IEC 60059表示的0.2
二进制分数略大于0.2
,所以答案1 %/% 0.2
应该是4
大多数平台给出的5
.
还有许多其他类似的陷阱与浮点运算的属性有关(不仅仅在R中).关于这个主题的经典论文是每个计算机科学家应该知道的浮点运算.