.NET フレームワーク 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 によって検査されるように、Average 拡張メソッドへの (私のマシンでの) 実装が次のとおりであるためです。
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 に縛られています)。
しかし、外部ライブラリなしで整数の平均を計算するかなり単純な実装があるかどうかはまだ疑問です。そのような実装についてたまたま知っていますか?
ありがとう!!
アップデート:
前の 3 つの大きな整数の例は、オーバーフローの問題を説明するための単なる例です。問題は、タイプの最大値を超える大きな数になる可能性のある数値のセットの平均を計算することです。この混乱について申し訳ありません。さらに混乱を避けるために、質問のタイトルも変更しました。
皆さんありがとう!!