我想用这个公式计算多线程的欧拉数 =∑((3k) ^ 2 + 1)/(3k)!, k =0,... ,∞ ,但到目前为止我还没有得到正确的结果,其中一个问题是,当我使用相当大的数字时,我将超出阶乘函数的小数范围,这就是我的到目前为止已经完成了
static void Main(string[] args)
{
Console.WriteLine(Program.Calculate(5, 1));
}
public static decimal Calculate(int x, byte taskNumber)
{
var tasks = new List<Task<decimal>>();
for (int i = 0; i < x; i += (x / taskNumber))
{
int step = i;
tasks.Add(Task.Run(() =>
{
int right = (step + x / taskNumber) > x ? x : (step + x / taskNumber);
return ChunkE(step + 1, right);
}));
}
Task.WaitAll(tasks.ToArray());
return tasks.Select(t => t.Result).Aggregate(((i, next) => i + next));
}
然后我有简单的阶乘和欧拉函数
public static decimal ChunkFactorial(int left, int right)
{
//Console.WriteLine("ChunkFactorial Thread ID :" + Thread.CurrentThread.ManagedThreadId);
if (left == right)
{
return left == 0 ? 1 : left;
}
else
{
return right * ChunkFactorial(left, right - 1);
}
}
public static decimal ChunkE(int left, int right)
{
if(left == right)
{
return left == 0 ? 1 : left;
}
else
{
return ((3 * right) * (3 * right) + 1) / ChunkFactorial(left, right) + ChunkE(left, right - 1);
}
}
我想要实现的是
x
使用不同数量的任务计算欧拉数直到精度。我通过这个电话得到的是 41.01666..7 如果我增加
x
小数最终会溢出。如何解决我尝试使用 BigInteger 的这个问题,但它开始变得一团糟,我失去了结果的精确度。有什么想法吗?此外,当我用 1 个任务启动程序时,我得到一个结果,当我用 4(或 1 个不同)启动程序时,我得到不同的结果,我不知道我错过了什么..