Re: [HACKERS] multivariate statistics (v19)

Поиск
Список
Период
Сортировка
От Dean Rasheed
Тема Re: [HACKERS] multivariate statistics (v19)
Дата
Msg-id CAEZATCUaVN0WQN_S3dR4y9SMRU8gmJc3vDggfvAR0W4cz3apcg@mail.gmail.com
обсуждение исходный текст
Ответ на Re: [HACKERS] multivariate statistics (v19)  (David Fetter <david@fetter.org>)
Ответы Re: [HACKERS] multivariate statistics (v19)  (Tomas Vondra <tomas.vondra@2ndquadrant.com>)
Список pgsql-hackers
On 8 February 2017 at 16:09, David Fetter <david@fetter.org> wrote:
> Combinations are n!/(k! * (n-k)!), so computing those is more
> along the lines of:
>
> unsigned long long
> choose(unsigned long long n, unsigned long long k) {
>     if (k > n) {
>         return 0;
>     }
>     unsigned long long r = 1;
>     for (unsigned long long d = 1; d <= k; ++d) {
>         r *= n--;
>         r /= d;
>     }
>     return r;
> }
>
> which greatly reduces the chance of overflow.
>

Hmm, but that doesn't actually prevent overflows, since it can
overflow in the multiplication step, and there is no protection
against that.

In the algorithm I presented, the inputs and the intermediate result
are kept below INT_MAX, so the multiplication step cannot overflow the
64-bit integer, and it will only raise an overflow error if the actual
result won't fit in a 32-bit int. Actually a crucial part of that,
which I failed to mention previously, is the first step replacing k
with min(k, n-k). This is necessary for inputs like (100,99), which
should return 100, and which must be computed as 100 choose 1, not 100
choose 99, otherwise it will overflow internally before getting to the
final result.

Regards,
Dean



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Robert Haas
Дата:
Сообщение: [HACKERS] pg_basebackup -R
Следующее
От: Andres Freund
Дата:
Сообщение: Re: [HACKERS] pg_bsd_indent: implement -lps ("leave preprocessorspace")