【问题标题】:floating point issue in R? [duplicate]R中的浮点问题? [复制]
【发布时间】:2011-10-16 00:50:30
【问题描述】:

可能重复:
Why are these numbers not equal?

以下表达式的计算结果为 0.1,被认为大于 0.1。

> round(1740/600,0) - 1740/600
[1] 0.1
> (round(1740/600,0) - 1740/600) <= 0.1
[1] FALSE //???!!???
> (round(1740/600,0) - 1740/600) <= 0.1000000000000000000000000000000000000001
[1] TRUE

认为问题可能是由于四舍五入我尝试了这个结果相同:

> 3 - 2.9
[1] 0.1
> (3 - 2.9) <=0.1
[1] FALSE

那么,是什么给出的,我如何在不伪造截止值的情况下修复它?

【问题讨论】:

标签: r floating-point floating-accuracy


【解决方案1】:

有些 R 函数会自动对“等式问题”采取明智的方法:

> (3 - 2.9) <=0.1
#[1] FALSE

> all.equal( (3 - 2.9) , 0.1)
#[1] TRUE

它使用 R 的最小正浮点数的 sqrt 作为其默认阈值,因此它可以处理乘法和除法传播错误。最终在 1e-08 左右

【讨论】:

    【解决方案2】:

    来自Floating-Point Guide

    为什么我的数字,比如 0.1 + 0.2 加起来不是很好的 0.3,而且 相反,我得到了一个奇怪的结果,比如 0.30000000000000004?

    因为在内部,计算机使用一种格式(二进制浮点) 根本无法准确表示像 0.1、0.2 或 0.3 这样的数字。

    当代码被编译或解释时,你的“0.1”已经 以该格式四舍五入到最接近的数字,这会导致小 甚至在计算发生之前就有舍入误差。

    我可以做些什么来避免这个问题?

    这取决于你在做什么样的计算。

    • 如果您确实需要将结果精确相加,尤其是在 你用钱工作:使用特殊的十进制数据类型。
    • 如果你只是 不想看到所有这些额外的小数位:只需格式化您的 结果在显示时四舍五入到固定的小数位数。
    • 如果您没有可用的十进制数据类型,另一种方法是工作 带整数,例如完全以美分计算金钱。但是这个 工作量更大,也有一些缺点。

    【讨论】:

    • 所以如果我需要进行精确比较,我应该将小数移到右边并截断,以便比较整数?
    • @dnagirl:或者使用 epsilon 值进行比较(有关更多详细信息,请参见链接)。但无论如何,当您处理不精确的数据时,请放弃“精确比较”的想法。真正的问题是你的数据来自哪里——如果你的输入已经是近似的,那么担心像这样的人为极端情况是毫无意义的。
    • 在这种情况下,我试图通过测量时间与一组周期性事件的接近程度来对时间过程数据进行子集化。我的数据每秒测量一次。事件每隔 10 分钟发生一次。我想在每个事件的任一侧获得 60 秒。
    • 查看all.equal 以测试两个数字是否(几乎)相等。
    • @dnagirl:所以你在比较第二粒度时间戳?在这种情况下,纯粹使用整数将是最简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多