.NET Framework 3.5.
Я пытаюсь вычислить среднее количество некоторых довольно больших чисел.
Например:
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var items = new long[]
{
long.MaxValue - 100,
long.MaxValue - 200,
long.MaxValue - 300
};
try
{
var avg = items.Average();
Console.WriteLine(avg);
}
catch (OverflowException ex)
{
Console.WriteLine("can't calculate that!");
}
Console.ReadLine();
}
}
Очевидно, что математический результат равен 9223372036854775607 (long.MaxValue - 200
), но я получаю там исключение. Это связано с тем, что реализация (на моей машине) метода Среднего расширения, как проверено .NET Reflector:
public static double Average(this IEnumerable<long> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
long num = 0L;
long num2 = 0L;
foreach (long num3 in source)
{
num += num3;
num2 += 1L;
}
if (num2 <= 0L)
{
throw Error.NoElements();
}
return (((double) num) / ((double) num2));
}
Я знаю, что могу использовать библиотеку BigInt (да, я знаю, что это включено в .NET Framework 4.0, но я привязан до 3,5).
Но мне все еще интересно, есть ли довольно простая реализация вычисления среднего числа целых чисел без внешней библиотеки. Вы узнали о такой реализации?
Спасибо!!
UPDATE:
Предыдущий пример из трех больших целых чисел был просто примером, иллюстрирующим проблему переполнения. Речь идет о вычислении среднего числа любых наборов чисел, которые могут суммироваться с большим числом, превышающим максимальное значение типа. Прошу прощения за эту путаницу. Я также изменил название вопроса, чтобы избежать дополнительной путаницы.
Спасибо всем!