171の階乗を取得しようとするたびに、INFを取得します。170は正常に動作します。スクリプトで171+の階乗を取得することは可能ですか?どのように?私の機能:
function factorial($n) {
if ($n == 0) return 1;
return $n * factorial($n - 1);
}
非常に大きな数を扱う場合は、それを可能にする拡張機能を使用する必要があります。
BCMath(http://www.php.net/manual/en/book.bc.php)とGMP(http://www.php.net/manual/en/book.gmp.php)があります。
echo "1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000"
しかし、実際には、関数は問題ありません。PHPにはそのような精度が欠けていると思います。私はPythonで値(正しいところで)を取得しました
32ビットマシンで最大倍精度浮動小数点数を超える値を取得している可能性があります(~10^308
)。170!階乗は~7.25741562 × 10^307
そのすぐ下にありますが、171!大きいです。最善の策は、EboMikeまたはCrozinが回答に推奨するライブラリの1つを使用することです。
nが大きい場合は、nを計算できます。スターリングの近似を使用すると、エラーがほとんどなく、非常に高速です。この投稿を見てください。関数の分析といくつかのサンプルコードがあります。
http://threebrothers.org/brendan/blog/stirlings-approximation-formula-clojure/
32ビットを使用して保持できる数よりも大きい数です。同じコードを64ビットコンピューターで実行すると、機能するはずです。