Ho 3 numeri interi con segno molto grandi.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Voglio calcolare la loro media troncata. Il valore medio atteso è long.MaxValue - 1
, ovvero 9223372036854775806
.
È impossibile calcolarlo come:
long avg = (x + y + z) / 3; // 3074457345618258600
Nota: ho letto tutte quelle domande sulla media di 2 numeri, ma non vedo come questa tecnica possa essere applicata alla media di 3 numeri.
Sarebbe molto facile con l'uso di BigInteger
, ma supponiamo che non possa usarlo.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Se mi converto in double
, ovviamente, perdo la precisione:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
Se mi converto in decimal
, funziona, ma supponiamo anche che non possa usarlo.
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
Domanda: esiste un modo per calcolare la media troncata di 3 numeri interi molto grandi solo con l'utilizzo del long
tipo? Non considerare questa domanda come specifica per C #, solo che è più facile per me fornire esempi in C #.
long.MinValue
e long.MaxValue
tra i valori.
BigInteger
o decimal
è escluso, o è solo per rendere la cosa difficile?