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

gun*_*sus 2 floating-point r floating-accuracy

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

在Win 7-32上运行R-2.15.2

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
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)

NPE*_*NPE 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"
Run Code Online (Sandbox Code Playgroud)

该文档%%有以下说法:

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

还有许多其他类似的陷阱与浮点运算的属性有关(不仅仅在R中).关于这个主题的经典论文是每个计算机科学家应该知道的浮点运算.