2009-03-01 22 views
7

Estoy trabajando en una aplicación que necesitará manejar números muy grandes.Tipos para números grandes

Revisé algunas clases de LargeNumber disponibles y encontré algunas con las que estoy contento. Tengo una clase para enteros grandes y para números grandes de coma flotante.

Dado que algunos de los números serán pequeños y grandes, la pregunta es si vale la pena verificar la longitud del número y si es pequeño use un C# int normal o doble y si es grande use las otras clases que tengo o si ya estoy usando las clases Large Integer y Large Float, debería seguir con ellos incluso para números más pequeños.

Mi consideración es puramente rendimiento. Voy a ahorrar bastante tiempo en los cálculos por los números más pequeños que sería conveniente comprobar cada número después de que se pone en

+0

¿Qué clases está utilizando para números más grandes? – ahsteele

+0

Estoy jugando con algunos. Microsoft.FSharp.Math.BigInt Microsoft.SolverFoundation.Common.BigInteger http://www.codeproject.com/csharp/biginteger.asp IntX para los decimales i estoy usando w3b.sine Microsoft.FSharp.Math.BigNum Voy a hacer algunos puntos de referencia en todos ellos y ver lo que me sale – Sruly

+0

favor ver esta [pregunta] (http: //stackoverflow.com/questions/494923/numbers-that-exceeds-basic-types-in-c). –

Respuesta

2

realmente difícil decir -. Depende de sus bibliotecas 3 ª parte :)

mejor apuesta sería usar la clase System.Diagnostics.StopWatch, hacer un montón de cálculos diferentes, cronometrarlos y comparar los resultados, supongo ...

[EDITAR] - Sobre los puntos de referencia, haría una serie de pruebas comparativas largeInt-type para hacer los cálculos en números regulares de 32/64 bits, y una serie que comprueba si el número puede caber en los tipos regulares Int32/Int64 (lo que deberían), "downcasting" a estos tipos, y luego ejecuta el mismo Calcu ciones usando estos tipos. A partir de su pregunta, esto suena como lo que hará si los tipos incorporados son más rápidos ..

Si su aplicación está destinada a más personas que usted, intente ejecutarlas en máquinas diferentes (de núcleo único, multinúcleo) , Plataformas de 32 bits, 64 bits), y si la plataforma parece tener un gran impacto en el tiempo que toman los cálculos, utilice algún tipo de patrón de estrategia para hacer los cálculos de manera diferente en diferentes máquinas.

Buena suerte :)

+0

¿Qué tipo de pruebas de referencia haría usted? – Sruly

+0

@Sruly: las que duplican el tipo de matemática que necesita su aplicación ;-p –

+0

Respuesta original actualizada con material de referencia específico: P – cwap

2

Yo esperaría que una biblioteca gran número decente sería capaz de hacer esta optimización por sí mismo ...

2

yo diría que sí, el cheque será más que pagar por sí mismo, siempre y cuando tengas suficientes valores dentro del rango normal.

La lógica es simple: una suma entera es una instrucción de ensamblaje. Combinado con una comparación, son tres o cuatro instrucciones. Cualquier implementación de software de tal operación probablemente sea mucho más lenta.

De manera óptima, esta comprobación debe realizarse en las bibliotecas de LargeNumber. Si no lo hacen, es posible que necesite un envoltorio para evitar tener cheques en todo el lugar. Pero también debes pensar en el costo adicional del envoltorio.

0

Trabajé en un proyecto en el que los mismos campos necesitaban manejar números muy grandes y al mismo tiempo manejaban la precisión para números muy pequeños.
Terminó almacenando campos (mantisa y exponente) para cada número de ese tipo.
Hicimos una clase para cálculos de mantisa/exponente y funcionó bien.

Cuestiones relacionadas