Факториал 170+ - PullRequest
       16

Факториал 170+

6 голосов
/ 22 ноября 2010

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

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

Ответы [ 6 ]

8 голосов
/ 22 ноября 2010

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

Есть BCMath (http://www.php.net/manual/en/book.bc.php) и GMP (* 1006)*).

5 голосов
/ 22 ноября 2010

Вы должны будете использовать BC Math или GNU MP расширение.PHP не предоставляет никаких инструментов для операций с высокими значениями или с высокой точностью OOTB.

3 голосов
/ 22 ноября 2010

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

3 голосов
/ 22 ноября 2010
echo "1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000"

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

1 голос
/ 25 ноября 2010

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

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

1 голос
/ 22 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...