核心R引擎有一个严重的缺陷,它表达了Modulus操作的输出:
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返回坏值而没有底层细节来显示浮点delta.有没有办法揭露模数似乎附加的基础残值?它是不可见的.
编辑:根据下面的andrew.punnett的慷慨示例,print(1.99, digits = 22)返回1.99(没有浮动扩展),而print(1.99 %% 1, digits = 22)返回0.98999999999999999.根据Aaron的敏锐眼光,这似乎与版本和/或系统有关.
谢谢!