.NET Framework 3.5.
Estoy tratando de calcular el promedio de algunos números bastante grandes.
Por ejemplo:Función promedio sin excepción de desbordamiento
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var items = new long[]
{
long.MaxValue - 100,
long.MaxValue - 200,
long.MaxValue - 300
};
try
{
var avg = items.Average();
Console.WriteLine(avg);
}
catch (OverflowException ex)
{
Console.WriteLine("can't calculate that!");
}
Console.ReadLine();
}
}
Obviamente, el resultado matemático es 9223372036854775607 (long.MaxValue - 200
), pero me da una excepción allí. Esto se debe a la aplicación (en mi máquina) para el método de promedio de extensión, como inspeccionado por .NET Reflector es:
public static double Average(this IEnumerable<long> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
long num = 0L;
long num2 = 0L;
foreach (long num3 in source)
{
num += num3;
num2 += 1L;
}
if (num2 <= 0L)
{
throw Error.NoElements();
}
return (((double) num)/((double) num2));
}
Sé que puedo utilizar una biblioteca Bigint (sí, ya sé que es included en. NET Framework 4.0, pero estoy vinculado a 3.5).
Pero todavía me pregunto si hay una implementación bastante directa de calcular el promedio de enteros sin una biblioteca externa. ¿Por casualidad sabes acerca de tal implementación?
Gracias!
ACTUALIZACIÓN:
El ejemplo anterior, de tres números enteros grandes, era sólo un ejemplo para ilustrar el problema de desbordamiento. La pregunta es sobre el cálculo de un promedio de cualquier conjunto de números que podría sumar un número grande que exceda el valor máximo del tipo. Perdón por esta confusión También cambié el título de la pregunta para evitar confusión adicional.
Gracias a todos !!
De todos modos va a convertir su suma en 'doble' ¿por qué no usar el tipo' doble' para el acumulador de suma? Puede haber algunos pequeños errores como resultado de truncar "largo" al ancho de mantisa. – ony
@ony: Parece que no tiene acceso al código de la función Promedio. ¿Por qué otra razón usaría Reflector en él? – ANeves
@ANeves: Es solo una variante de implementación como respuesta a "Todavía me pregunto si hay". – ony