在 R 中计算 *integer* 二项式系数
Posted
技术标签:
【中文标题】在 R 中计算 *integer* 二项式系数【英文标题】:Calculating an *integer* binomial coefficient in R 【发布时间】: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))
。如果您的输入是非整数,您只需要四舍五入。
【参考方案1】:
一种方法是使用 VeryLargeIntegers 包。功能是:
binom(n, k)
例如binom(1000,50) 甚至 binom(10000000,50)
学习如何制作非常大的整数也是明智之举,参见:as.vli('1234567890123456789')
https://www.rdocumentation.org/packages/VeryLargeIntegers/versions/0.1.8/topics/06.%20Binomial%20coefficients
该软件包并非完全没有错误,更大的计算需要一段时间。
乔博士。
【讨论】:
【参考方案2】:不用担心转换,机器精度不会有问题。整数后面的L肯定不是double,[R]语法怪怪的,肯定不是long值,不能有小数点。
【讨论】:
以上是关于在 R 中计算 *integer* 二项式系数的主要内容,如果未能解决你的问题,请参考以下文章