2010-11-22 15 views
6

chaque fois que j'essaie d'obtenir la factorielle de 171, je reçois INF. 170 fonctionne bien. Est-il possible d'obtenir le factorial de 171+ dans un script? Comment? Ma fonction:Factoriel de 170+

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

Répondre

5

Vous devrez utiliser l'extension BC Math ou GNU MP. PHP ne fournit aucun outil pour les opérations de haute valeur ou de haute précision OOTB.

3
echo "1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000" 

vraiment bien, votre fonction est très bien. Je pense que PHP n'a pas ce genre de précision. J'ai la valeur (c'est correct btw) en python

+0

Je ne ai pas besoin 171 factoriel, j'ai besoin du script, ce qui pourrait compter que :) – Tom

+0

ouvrir un Terminal. tapez 'python' tapez 'math' type 'math.factorial (171)'. vous ne pouvez pas le faire en PHP sans une extension comme @Crozin et @EboMike mentionné –

+0

Même google ne fera pas 171, il s'arrête à 170. – DampeS8N

1

C'est un nombre plus grand que ce que vous pouvez conserver en utilisant 32 bits. Si vous exécutez le même code sur un ordinateur 64 bits, cela devrait fonctionner.

+0

Pas exactement une solution très portable. – EboMike

+0

Non, mais en fonction de l'endroit où le code doit être exécuté, il se peut que ce soit le plus simple. – thelem

+0

Un ordinateur 64 bits a aussi une limite: D ... Il serait juste 2^21 fois plus grand: P –

8

Si vous traitez de très grands nombres, vous devrez utiliser une extension qui vous permettra de le faire. Il existe BCMath (http://www.php.net/manual/en/book.bc.php) et GMP ().

+4

L'extension GNU MP offre même une fonction 'gmp_fact()' pour calculer de gros factoriels de la boîte. –

3

Vous obtenez probablement une valeur qui dépasse le flottant double précision maximale dans une machine 32 bits (~10^308). 170! factorielle est ~7.25741562 × 10^307 qui est juste en dessous de cela, cependant, 171! est plus grand. Votre meilleur pari est d'utiliser l'une des bibliothèques recommandées par EboMike ou Crozin dans leurs réponses.