Невозможно вычислить факториал, получая вывод как 0 в C

Пытался вычислить факториал 65, получил правильный результат. Все, что больше 65, приводит к выводу 0. Шокирует, так как я использую unsigned long int. Что не так?

Код:

#include <stdio.h>

void factorial(int unsigned long);
int main()
{
    int unsigned long num, result;
    printf("\nEnter number to obtain factorial : ");
    scanf("%ld", &num);
    factorial(num);
}
void factorial (int unsigned long x)
{
    register int unsigned long f = 1;
    register int unsigned long i;
    for (i=x;i>=1;i--)
        f= f*i;
    printf("\nFactorial of %lu = %lu\n",x,f);
}

person user13863346    schedule 04.07.2020    source источник
comment
В то время как C позволяет писать int unsigned long, опытный программист никогда не пишет так, используя вместо этого unsigned long или unsigned long int.   -  person Antti Haapala    schedule 04.07.2020
comment
совет по именованию: при использовании однобуквенных переменных избегайте переменных, которые могут предложить неправильное имя типа. Например, имя f может навести вас на мысль о переменной как float. По мере того, как ваш код становится длиннее или сложнее, эти вещи становятся более важными.   -  person Myst    schedule 04.07.2020
comment
Откуда вы знаете, что получили правильный результат, когда вычисляете 65! ?   -  person M. Nejat Aydin    schedule 04.07.2020
comment
@M.NejatAydin Вы правы, мое значение факториала 65, сгенерированное моим кодом, равно 9223372036854775808, что очень отличается от реального значения.   -  person user13863346    schedule 04.07.2020


Ответы (2)


Вы, конечно, не получили правильный результат для 65! log2(65!) чуть более 302 бит (погуглите), поэтому для правильного расчета вам потребуется long int не менее 303 бит. В мире нет компьютера, где long int превышает 300 бит (посмотрим, как стареет этот ответ!).

Самый большой факториал, который вы можете вычислить в 64 битах, равен 20! (что примерно 2.4e18).

person John Zwinck    schedule 04.07.2020
comment
Тогда как Google или любой другой онлайн-калькулятор может дать значение факториала любого числа больше 20? Разбивает ли 300+ битов на куски по 64, например, 64-битные разбиваются на 32-битные процессоры? - person user13863346; 04.07.2020
comment
@user13863346: Они используют en.wikipedia.org/wiki/Arbitrary-precision_arithmetic - person John Zwinck; 04.07.2020
comment
В любом случае нуб вроде меня может попробовать реализовать что-то подобное? - person user13863346; 04.07.2020
comment
Конечно, вы можете использовать библиотеку GMP: gmplib.org - person John Zwinck; 04.07.2020

В дополнение к @JohnZwinck максимальное значение переменной типа unsigned long long (ULLONG_MAX) равно 18446744073709551615. Таким образом, все значения больше 20! будут иметь значение мусора

Вы можете обратиться к это для получения дополнительной информации.

person Sai Sreenivas    schedule 04.07.2020
comment
Это не максимальное значение, это минимальное максимальное значение. - person Antti Haapala; 04.07.2020
comment
Это не отвечает на вопрос. - person M. Nejat Aydin; 04.07.2020