【发布时间】:2018-11-21 20:27:06
【问题描述】:
从n中选择k个对象的方式数,即二项式系数n!/(k!(nk)!) , 当 n 和 k 是整数时是整数。我如何计算这个以保证结果既正确又是整数类型? choose 函数即使使用整数参数也会返回双精度:
> typeof(choose(4L, 2L))
[1] "double"
与手动计算一样,例如n-choose-2 = n(n-1)/2
typeof((4L * (4L - 1L)) / 2L)
[1] "double"
当然,我可以用 as.integer() 强制转换为整数,但我对机器精度感到紧张:
> as.integer(3.999999999999999)
[1] 3
> as.integer(3.9999999999999999)
[1] 4
round()(默认为digits=0)四舍五入到最接近的整数,但返回一个双精度类型的值。如果我可以确定向as.integer(round(...)) 提供一个以双精度格式存储的整数可以保证四舍五入到正确的整数,而不会被机器精度绊倒,那么as.integer(round(choose(n, k))) 是可以接受的。是这样吗?或者有没有替代choose() 的方法可以为整数参数返回一个整数?
【问题讨论】:
-
typeof((4L * (4L - 1L)) %/% 2L)会给你整数,如果你选择使用%/%而不是/你会得到整数 -
我不确定这是@ChrisW 想要的...因为
5 %/% 2 = 2 -
确实,我认为这不能回答我的问题。
-
既然 n!/(k!(n-k)!) 如果 n 和 k 是整数,则总是返回一个整数,因此无需
round它,只需执行as.integer(choose(n, k))。如果您的输入是非整数,您只需要四舍五入。
标签: r integer binomial-coefficients