9

171の階乗を取得しようとするたびに、INFを取得します。170は正常に動作します。スクリプトで171+の階乗を取得することは可能ですか?どのように?私の機能:

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

6 に答える 6

10

非常に大きな数を扱う場合は、それを可能にする拡張機能を使用する必要があります。

BCMath(http://www.php.net/manual/en/book.bc.php)とGMP(http://www.php.net/manual/en/book.gmp.php)があります。

于 2010-11-22T20:06:23.263 に答える
7

BCMathまたはGNUMP拡張機能を使用する必要があります。PHPは、高価値または高精度の操作OOTB用のツールを提供していません。

于 2010-11-22T20:05:23.037 に答える
4
echo "1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000"

しかし、実際には、関数は問題ありません。PHPにはそのような精度が欠けていると思います。私はPythonで値(正しいところで)を取得しました

于 2010-11-22T20:04:39.387 に答える
3

32ビットマシンで最大倍精度浮動小数点数を超える値を取得している可能性があります(~10^308)。170!階乗は~7.25741562 × 10^307そのすぐ下にありますが、171!大きいです。最善の策は、EboMikeまたはCrozinが回答に推奨するライブラリの1つを使用することです。

于 2010-11-22T20:06:30.260 に答える
2

nが大きい場合は、nを計算できます。スターリングの近似を使用すると、エラーがほとんどなく、非常に高速です。この投稿を見てください。関数の分析といくつかのサンプルコードがあります。

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

于 2010-11-25T08:44:55.407 に答える
1

32ビットを使用して保持できる数よりも大きい数です。同じコードを64ビットコンピューターで実行すると、機能するはずです。

于 2010-11-22T20:06:20.750 に答える