Mam 3 bardzo duże liczby całkowite ze znakiem.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Chcę obliczyć ich średnią obciętą. Oczekiwana średnia wartość to long.MaxValue - 1
, czyli 9223372036854775806
.
Nie da się tego obliczyć jako:
long avg = (x + y + z) / 3; // 3074457345618258600
Uwaga: czytałem wszystkie te pytania dotyczące średniej z 2 liczb, ale nie widzę, jak można zastosować tę technikę do średniej z 3 liczb.
Byłoby to bardzo łatwe przy użyciu BigInteger
, ale załóżmy, że nie mogę go użyć.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Jeśli przejdę na double
, to oczywiście stracę precyzję:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
Jeśli przejdę na decimal
, to działa, ale załóżmy też, że nie mogę go używać.
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
Pytanie: Czy można obliczyć obciętą średnią z 3 bardzo dużych liczb całkowitych tylko przy użyciu long
typu? Nie traktuj tego pytania jako specyficznego dla języka C #, po prostu łatwiej jest mi podać próbki w języku C #.
long.MinValue
i long.MaxValue
wśród wartości.
BigInteger
albo decimal
jest wykluczona, czy jest to tylko przez wzgląd na to co trudne?