【发布时间】:2018-05-17 01:11:25
【问题描述】:
核心 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 的 invisible 残差值会以意想不到的方式翻转。
虽然为我当前的应用程序解决这个问题是微不足道的:
floor((2.99 - floor(2.99)) * 100)
返回:99(正确)
sprintf("%.22f", floor((2.99 - floor(2.99)) * 100))
返回:99.0000000000000000000000(正确)
...我想知道 Modulus 还有多少其他实例返回错误值而没有显示浮点增量的基础细节。有没有办法暴露 Modulus 似乎附加的潜在剩余价值?否则它是不可见的。
编辑:根据下面 andrew.punnett 的慷慨示例,print(1.99, digits = 22) 返回 1.99(无浮点扩展),而 print(1.99 %% 1, digits = 22) 返回 0.98999999999999999。根据 Aaron 的敏锐眼光,这似乎取决于版本和/或系统。
谢谢!
【问题讨论】:
-
嗨,欢迎来到 StackOverflow!我担心您的第一次体验会很糟糕,因此会建议对您的问题进行一些编辑以阻止其中一些问题,并帮助您获得更好的答案。 1)有些人会假设您对浮点错误一无所知并居高临下地解释;所以我建议你编辑包括这可能是一个潜在的原因,你想知道如何更好地处理这个 2)有些人会因为指出“错误/缺陷”而生气,再次可能指向浮点问题;我建议您改写为“行为”。最美好的祝愿!
-
似乎还有一些系统特定的事情正在发生;对于
print(1.99, digits = 22)我得到1.989999999999999991118。 -
谢谢亚伦!我惊呆了(哈哈)1.99 的跨版本扩展存在差异——这真的很奇怪。但是非常感谢二进制表示链接!我可能会在不久的将来使用它。
-
可能的答案here as well