У мене є 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
Запитання: Чи існує спосіб обчислити усечену середню кількість 3 дуже великих цілих чисел лише з використанням long
типу? Не вважайте це питання специфічним для C #, просто мені простіше надати зразки в C #.
long.MinValue
і long.MaxValue
серед значень.
BigInteger
або decimal
виключається, чи це просто заради того, щоб зробити це важким?