上限函数显然不正确地四舍五入
Ceiling function apparently rounds incorrectly
谁能解释一下为什么 R 在 rounding/ceiling 上有问题,以及如何确保它计算正确?
N = 50e3
x = vector(length = N)
p = 0.995
ceiling(length(x)*(1-p))
251
ceiling(N*(1-p))
251
ceiling(N*0.005)
250
ceiling(50e3*0.005)
250
@rawr 链接到 Why are these numbers not equal? ,它解释了浮点计算的基本问题。在这种情况下:
print((1-0.995) - 0.005)
## [1] 4.336809e-18
因此,(1-0.005)*5e4
略微 大于 250(要查看此内容,您必须 print((1-0.005)*5e4, digits=22)
,因为 R 打印 默认情况下的舍入表示法)因此 ceiling()
将答案推到 251。
在这种 特殊的 情况下,您似乎可以通过将 (1-p)
四舍五入到小数点后三位 ceiling(N*round(1-p,3))
来获得所需的答案——但您绝对应该阅读链接的答案并考虑此解决方案是否能够满足您的所有需求。
谁能解释一下为什么 R 在 rounding/ceiling 上有问题,以及如何确保它计算正确?
N = 50e3
x = vector(length = N)
p = 0.995
ceiling(length(x)*(1-p))
251
ceiling(N*(1-p))
251
ceiling(N*0.005)
250
ceiling(50e3*0.005)
250
@rawr 链接到 Why are these numbers not equal? ,它解释了浮点计算的基本问题。在这种情况下:
print((1-0.995) - 0.005)
## [1] 4.336809e-18
因此,(1-0.005)*5e4
略微 大于 250(要查看此内容,您必须 print((1-0.005)*5e4, digits=22)
,因为 R 打印 默认情况下的舍入表示法)因此 ceiling()
将答案推到 251。
在这种 特殊的 情况下,您似乎可以通过将 (1-p)
四舍五入到小数点后三位 ceiling(N*round(1-p,3))
来获得所需的答案——但您绝对应该阅读链接的答案并考虑此解决方案是否能够满足您的所有需求。