Факториал 170+

каждый раз, когда я пытаюсь получить факториал 171, Я получаю INF. 170 отлично работает. Можно ли получить факториал 171+ в скрипте? Как? Моя функция:

function factorial($n) {
    if ($n == 0) return 1;
    return $n * factorial($n - 1);
}

6 ответов


вам придется использовать BC Math или GNU MP


Если вы имеете дело с очень большими числами, вы должны использовать расширение, которое позволяет сделать это.

есть BCMath (http://www.php.net/manual/en/book.bc.php), и ГМП (http://www.php.net/manual/en/book.gmp.php).


echo "1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000"

на самом деле, ваша функция в порядке. Я думаю, что PHP не хватает такой точности. Я получил значение (это правильно кстати) в python


вы, вероятно, получаете значение, превышающее максимальную двойную точность float в 32-разрядной машине (~10^308). 170! факториал ~7.25741562 × 10^307 что как раз под этим, однако, 171! быть крупнее. Лучше всего использовать одну из библиотек, рекомендованных EboMike или Crozin в своих ответах.


Это большее число, чем вы можете удерживать с помощью 32-бит. Если вы запустите тот же код на 64-разрядном компьютере, он должен работать.


для большого n вы можете вычислить n! очень быстро с небольшой погрешностью, используя приближение Стирлинга. Взгляните на этот пост; он имеет анализ функции и некоторый пример кода:

http://threebrothers.org/brendan/blog/stirlings-approximation-formula-clojure/