Tengo 3 enteros con signo muy grandes.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Quiero calcular su promedio truncado. El valor promedio esperado es long.MaxValue - 1
, que es 9223372036854775806
.
Es imposible calcularlo como:
long avg = (x + y + z) / 3; // 3074457345618258600
Nota: Leí todas esas preguntas sobre el promedio de 2 números, pero no veo cómo se puede aplicar esa técnica al promedio de 3 números.
Sería muy fácil con el uso de BigInteger
, pero supongamos que no puedo usarlo.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Si me convierto a double
, entonces, por supuesto, pierdo precisión:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
Si convierto a decimal
, funciona, pero también supongamos que no puedo usarlo.
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
Pregunta: ¿Hay alguna manera de calcular el promedio truncado de 3 enteros muy grandes solo con el uso de long
tipo? No considere esa pregunta como específica de C #, solo que es más fácil para mí proporcionar ejemplos en C #.
long.MinValue
y long.MaxValue
entre valores.
BigInteger
o decimal
se excluye, o es solo por hacer esto difícil?