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

您必须使用BC MathGNU MP扩展。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 在他们的答案中推荐的库之一。

于 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 回答