gpt4 book ai didi

r - 纠正R中模数误差的最佳方法?

转载 作者:行者123 更新时间:2023-12-05 00:12:41 26 4
gpt4 key购买 nike

核心 R 引擎在表达模数运算输出的方式上存在严重缺陷:
ceiling((1.99 %% 1) * 100)
返回:99(正确)
ceiling((2.99 %% 1) * 100)
返回:100(不正确)

该行为将表现为任何整数值 N + 2.99(例如 3.99 等)。如果这与浮点表示相关联,则系统不会表达差异的全部细节。这尤其令人不安,因为:

两者 (1.99 %% 1)(2.99 %% 1) 出现在 返回 0.99。

两者 ((1.99 %% 1) * 100)((2.99 %% 1) * 100) 出现在 返回 99。

但是,如果您进行任何四舍五入或类似的数学运算,2.99 的隐形残值会以意想不到的方式翻转事物。

虽然为我当前的应用程序解决这个问题很简单:
floor((2.99 - floor(2.99)) * 100)
返回:99(正确)
sprintf("%.22f", floor((2.99 - floor(2.99)) * 100))
返回:99.0000000000000000000000(正确)

...我想知道有多少其他实例 Modulus 返回错误值而没有显示浮点增量的底层细节。有没有办法暴露 Modulus 似乎附加的潜在剩余值(value)?否则是看不见的。

编辑:根据下面来自andrew.punnett 的慷慨示例,print(1.99, digits = 22)返回 1.99(无 float 扩展),而 print(1.99 %% 1, digits = 22)返回 0.98999999999999999。根据 Aaron 的敏锐眼光,这似乎取决于版本和/或系统。

谢谢!

最佳答案

这实际上不是 R 中的错误.这确实是floating-point arithmetic的属性(property).

出现问题是因为 1.99 或 2.99 都不能准确地表示为浮点数。可以存储在 double (64 位)浮点数中的最接近 2.99 的十进制数是 2.99000000000000021316282072803 ( try the conversion here )

因此,表达式计算为:

ceiling((2.99 %% 1) * 100) = ceiling(99.000000000000021316282072803)
= 100

相比之下,1.99 的最近表示是 1.989999999999999991118215803,它恰好给出了您期望的答案:
ceiling((1.99 %% 1) * 100) = ceiling(98.9999999999999991118215803)
= 99

两种结果对于 IEEE 754 浮点运算都是正确的,但正如您所见,只有一个结果与应用实数运算规则得到的结果一致。

这个问题因 R 中的默认行为而变得更加复杂。是截断每个浮点数 print() .如果您想查看更多数字,则必须提供 digits范围:
print(1.99, digits = 22)

但是,即使这样也不能在所有平台上为您提供正确的位数,因此准确查看浮点数的更可靠方法是:
cat(sprintf("%.22f\n", 1.99))

关于r - 纠正R中模数误差的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50381960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com