Я хочу рассчитать число Эйлера с несколькими потоками, используя эту формулу = Σ ((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) Я получаю другой результат я не знаю, что мне не хватает ..
Вы, кажется, забыли фактор 3 в (3k)! в знаменателе. – LutzL
Да, мне удалось поймать это, но я столкнулся с другой проблемой .. ChunkFactorial NEEDS должен быть из типа BigInteger, но я не могу делить десятичную с BigInteger .. любые предложения, как мне следует продолжить? – kuskmen
Обратите внимание, что ваш фактор факториала является лишь частичным факториалом, 'n! = (m-1)! * ChunkFactorial (m, n) '. В последнем суммировании отсутствует коэффициент '1/(m-1)!'. – LutzL