Факториал 170+

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

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

person Tom    schedule 22.11.2010    source источник


Ответы (6)


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

person Crozin    schedule 22.11.2010

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

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

person EboMike    schedule 22.11.2010
comment
Расширение GNU MP даже предлагает функцию gmp_fact() для вычисления больших факториалов из коробки. - person Alex Jasmin; 22.11.2010

echo "1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000"

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

person jon_darkstar    schedule 22.11.2010
comment
Мне не нужен факториал 171, мне нужен скрипт, который мог бы это посчитать :) - person Tom; 22.11.2010
comment
открыть терминал. тип 'python' тип 'импорт математики' тип 'math.factorial(171)'. вы не можете сделать это в PHP без упомянутых расширений, таких как @Crosin и @EboMike - person jon_darkstar; 22.11.2010
comment
лол, да. Калькулятор на самом деле побеждает поисковую систему в математике. Иди разберись. - person webbiedave; 23.11.2010
comment
Вы злой. Но +1 - person Kzqai; 20.12.2015

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

person GWW    schedule 22.11.2010

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

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

person abscondment    schedule 25.11.2010

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

person thelem    schedule 22.11.2010
comment
Не совсем портативное решение. - person EboMike; 22.11.2010
comment
Нет, но в зависимости от того, где должен выполняться код, он может оказаться самым простым. - person thelem; 22.11.2010
comment
У 64-битного компьютера тоже есть предел :D... Он будет просто в 2^21 раз больше :P - person Aurel Bílý; 22.11.2010
comment
Зависит от ОС; в Windows всегда будет 32 бита, а в Linux будет 64, как вы предлагаете. pubbs.net/200902/ php/ - person Dereleased; 22.11.2010