gpt4 book ai didi

c# - 为什么这个 BigInteger 值会导致堆栈溢出异常? C#

转载 作者:太空狗 更新时间:2023-10-30 00:01:20 25 4
gpt4 key购买 nike

我在 C# 中将 BigInteger 与阶乘函数结合使用。该程序的计算速度快如闪电,达到 5000!,但在 10000! 时出现溢出错误。根据wolfram alpha , 10000!大约是

10000! = 2.8 x 10^35659

据我所知 this post , BigInteger 存储在 int[] 数组中。如果我正确解释 int 类型,它使用 4 个字节,即 10000!使用大约 4 x log10(2.8 x 10^35659) = 142636 字节,其中我使用 log10(n)(以 10 为底的对数)作为数字的近似值n的位数。这只有 143 MB,但我仍然遇到堆栈溢出异常。为什么会这样?

using System;
using System.Numerics;

class Program
{
static void Main()
{
BigInteger hugeFactorial = Calculations.Factorial(5000);
}
}

class Calculations
{
public static BigInteger Factorial(int n)
{
if (n == 1) return n;
else return n*Factorial(n - 1);
}
}

最佳答案

线程的默认堆栈大小为 1 MB。您可以在创建新线程时更改它。我会把你的代码写成(不阻塞调用线程):

TaskCompletionSource<BigInteger> tcs = new TaskCompletionSource<BigInteger>();
var t = new Thread(() =>
{
var res = Calculations.Factorial(10000);
tcs.SetResult(res);
},
1024*1024*16 //16MB stack size
);
t.Start();
var result = await tcs.Task;
Console.Write(result);

关于c# - 为什么这个 BigInteger 值会导致堆栈溢出异常? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com