BigInteger 不能表示无穷大

BigInteger cannot represent infinity

当我 运行 这段代码时,我得到 运行-time exception

OverflowException: BigInteger cannot represent infinity.

BigInteger sum=0;
for (double i=1 ; i<=1000 ;i++ )
    sum += (BigInteger) Math.Pow(i,i);
Console.WriteLine(sum);

据我了解,BigInteger 值应该没有限制。那么为什么它会抛出 OverflowException?

发生这种情况是因为您超出了 double 的限制。

Math.Powdouble 秒内计算,因此有限结果只能与 1.7e308 一样大,超过 i = 144 的数字。所以它导致 double.PositiveInfinity,无法转换为 BigIntegerBigInteger 没有像 double 那样对无穷大进行特殊表示,它只能存储整数,而无穷大不是整数 - 即使 BigInteger 没有限制,它也永远不会达到无穷大。 BigInteger 实际上也有一个限制,当它用来存储数字的内部数组达到其最大大小时(你可能会 运行 更快地耗尽内存)。

在这种情况下你可以使用BigInteger.Pow来避免这种情况,例如

BigInteger sum = 0;
for (int i = 1; i <= 1000; i++)
    sum += BigInteger.Pow(i, i);

结果很大,符合预期。