J'ai 3 très grands entiers signés.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Je veux calculer leur moyenne tronquée. La valeur moyenne attendue est long.MaxValue - 1
, ce qui est 9223372036854775806
.
Il est impossible de le calculer comme:
long avg = (x + y + z) / 3; // 3074457345618258600
Remarque: j'ai lu toutes ces questions sur la moyenne de 2 nombres, mais je ne vois pas comment cette technique peut être appliquée à la moyenne de 3 nombres.
Ce serait très facile avec l'utilisation de BigInteger
, mais supposons que je ne puisse pas l'utiliser.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Si je me convertis en double
, alors, bien sûr, je perds la précision:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
Si je me convertis en decimal
, cela fonctionne, mais supposons également que je ne puisse pas l'utiliser.
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
Question: Existe - t-il un moyen de calculer la moyenne tronquée de 3 très grands entiers uniquement avec l'utilisation de long
type? Ne considérez pas cette question comme spécifique à C #, mais il m'est plus facile de fournir des exemples en C #.
long.MinValue
et long.MaxValue
parmi les valeurs.
BigInteger
ou decimal
est exclue, ou est-ce simplement pour rendre cela difficile?