[R] choose(n, k) as n approaches k

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Tue Jan 14 16:03:51 CET 2020

On 13/01/2020 6:33 p.m., Wright, Erik Scott wrote:
> This struck me as incorrect:
>> choose(3.999999, 4)
> [1] 0.9999979
>> choose(3.9999999, 4)
> [1] 0
>> choose(4, 4)
> [1] 1
>> choose(4.0000001, 4)
> [1] 4
>> choose(4.000001, 4)
> [1] 1.000002
> Should base::choose(n, k) check whether n is within machine precision of k and return 1?

I don't think that's the solution.  The current code checks whether n is 
within 1e-7 of an integer; if it is and n-k is smaller than k, it 
computes choose(n, n-k) instead.  The problem in your second example is 
that n-k < 0 which implies the answer should be zero.  In the 4th 
example n-k > 0 but it is not an integer; the code rounds k to an 
integer, but the transformation to n-k happens after that, so the code 
ends up working with a non-integer.

I think a solution would be to force n to be an integer if it is very 
close to one.

I note that the source to lchoose() seems to already do this:  it 
handles your examples nicely.

Duncan Murdoch

More information about the R-help mailing list