3つの非常に大きな符号付き整数があります。
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
切り捨て平均を計算したいと思います。期待される平均値はlong.MaxValue - 1
、です9223372036854775806
。
次のように計算することはできません。
long avg = (x + y + z) / 3; // 3074457345618258600
注:平均2つの数値に関する質問をすべて読みましたが、平均3つの数値にその手法を適用する方法がわかりません。
を使用すると非常に簡単ですが、使用BigInteger
できないとしましょう。
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
double
もちろん、に変換すると、もちろん精度が失われます。
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
に変換するdecimal
と動作しますが、使用できないとしましょう。
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
質問:long
タイプを使用した場合にのみ、3つの非常に大きな整数の切り捨て平均を計算する方法はありますか?その質問をC#固有のものと見なさないでください。C#でサンプルを提供する方が簡単です。
long.MinValue
とlong.MaxValue
値の間。
BigInteger
か、decimal
除外されているが、あるいはそれが、これはハード作りのためだけのでしょうか?