从 n 中选择 k 对象的方式,即二项式系数 n!/(k!(nk)!) ,当 n 和 k 是整数时,是一个整数。如何计算保证结果正确且整数类型? choose
函数返回一个double,即使是整数参数:
> 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
)舍入到最接近的整数,但返回double类型的值。如果我可以确定提供以双格式存储到as.integer(round(...))
的整数保证舍入到正确的整数,从不被机器精度绊倒,那么as.integer(round(choose(n, k)))
是可以接受的。是这样的吗?或者是否有choose()
的替代方法将返回整数参数的整数?
答案 0 :(得分:0)
一种方法是使用VeryLargeIntegers包。功能是:
binom(n,k)
例如Binom(1000,50)甚至Binom(10000000,50)
明智的做法是学习如何也制作非常大的整数cf:as.vli('1234567890123456789')
该软件包并非完全没有错误,并且较大的计算将需要一段时间。
乔博士。