Количество способов выбора k объектов из n , то есть биномиальный коэффициент 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
) округляет до ближайшего целого числа, но возвращает значение типа double.Если бы я мог быть уверен, что подача целого числа, хранящегося в двойном формате, в as.integer(round(...))
гарантированно округляет до правильного целого числа, никогда не отключаясь из-за машинной точности, тогда as.integer(round(choose(n, k)))
будет приемлемым.Это тот случай?Или есть альтернатива choose()
, которая будет возвращать целое число для целочисленных аргументов?