Tenho 3 inteiros com sinal muito grandes.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Quero calcular sua média truncada. O valor médio esperado é long.MaxValue - 1
, que é 9223372036854775806
.
É impossível calculá-lo como:
long avg = (x + y + z) / 3; // 3074457345618258600
Nota: eu li todas aquelas questões sobre a média de 2 números, mas não vejo como essa técnica pode ser aplicada à média de 3 números.
Seria muito fácil com o uso de BigInteger
, mas vamos assumir que não posso usá-lo.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Se eu converter para double
, é claro, perco a precisão:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
Se eu converter para decimal
, funcionará, mas também vamos supor que não posso usá-lo.
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
Pergunta: Existe uma maneira de calcular a média truncada de 3 inteiros muito grandes apenas com o uso de long
tipo? Não considere essa pergunta como específica do C #, apenas é mais fácil para mim fornecer exemplos em C #.
long.MinValue
e long.MaxValue
entre os valores.
BigInteger
ou decimal
é excluído, ou é apenas por uma questão de fazer este disco?