【问题标题】:1 %% 0.1 = 0.1 AND 1 %% 0.2 = 0.2?1 %% 0.1 = 0.1 和 1 %% 0.2 = 0.2?
【发布时间】:2013-03-10 21:34:07
【问题描述】:

我是否遗漏了基础包中的某个东西或错误?

我在 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

【问题讨论】:

  • 您应该在问题中包含对预期结果的解释

标签: r floating-point floating-accuracy


【解决方案1】:

首先,我无法使用在 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

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

【讨论】:

  • (+1) 以获得出色的链接。我将不得不为此添加书签,因为这类东西经常出现在 SO 下的 R 标签下。
  • (+1) 获取链接和答案。但我无法访问 %% 文档。
猜你喜欢
  • 2021-11-04
  • 2020-10-24
  • 1970-01-01
  • 2011-10-16
  • 2013-01-10
  • 2014-05-05
  • 2020-02-15
  • 1970-01-01
相关资源
最近更新 更多