visual variable tipos studio que programacion long flotantes float declaracion datos c# biginteger largenumber j#

variable - Enteros grandes en C#



variable int (12)

A partir de .NET 4.0 puede usar la clase System.Numerics.BigInteger. Consulte la documentación aquí: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx

Otra alternativa es la clase IntX .

IntX es una biblioteca de enteros de precisión arbitraria escrita en C # 2.0 puro con implementación rápida de algoritmos de multiplicación / división O (N * log N). Proporciona todas las operaciones básicas en enteros como suma, multiplicación, comparación, desplazamiento en bits, etc.

Actualmente tomo prestado java.math.BigInteger de las bibliotecas J # como se describe aquí . Nunca antes había usado una biblioteca para trabajar con enteros grandes, esto parece lento, del orden de 10 veces más lento, incluso para números de longitud ulong . ¿Alguien tiene bibliotecas mejores (preferiblemente gratuitas), o es este nivel de rendimiento normal?


Aquí hay varias implementaciones de BigInteger en C #. He utilizado la implementación BigInteger de Mono, funciona bastante rápido (lo he usado en CompactFramework)

Castillo inflable

Mono


Creo que podría optimizar la implementación si realiza todas las operaciones en BigInts que van a devolver resultados más pequeños que un tipo nativo (por ejemplo, int64) en los tipos nativos y solo trata con la matriz grande si va a desbordarse.

editar Esta implementación en el proyecto de código , parece solo 7 veces más lenta ... Pero con la optimización anterior, puede hacer que funcione de manera casi idéntica a los tipos nativos para números pequeños.


Esto no lo ayudará, pero se suponía que debía haber una clase BigInteger en .Net 3.5; se cortó, pero de las declaraciones hechas en PDC, estará en .Net 4.0. Al parecer, han dedicado mucho tiempo a optimizarlo, por lo que el rendimiento debería ser mucho mejor que el que obtendrás ahora.

Además, esta pregunta es esencialmente un duplicado de ¿Cómo puedo representar un entero muy grande en .NET?


Esto puede sonar como una sugerencia extraña, pero ¿ha probado el tipo decimal para ver qué tan rápido funciona?

El rango decimal es ± 1.0 × 10 ^ -28 a ± 7.9 × 10 ^ 28, por lo que aún no puede ser lo suficientemente grande, pero es más grande que un ulong.

Se suponía que iba a haber una clase BigInteger en .NET 3.5, pero se cortó .



La clase System.Numerics.BigInteger en .NET 4.0 se basa en Microsoft.SolverFoundation.Common.BigInteger de Microsoft Research.

La clase BigInteger la Solver Foundation se ve muy eficiente. No estoy seguro de la licencia bajo la que se publica, pero puede obtenerla here (descargue e instale Solver Foundation y encuentre Microsoft.Solver.Foundation.dll).


No estoy seguro del rendimiento, pero IronPython también tiene una clase BigInteger. Está en el espacio de nombres Microsoft.Scripting.Math.


Sí, será lento, y la diferencia de 10 veces es lo que yo esperaría. BigInt usa una matriz para representar una longitud arbitraria, y todas las operaciones deben realizarse manualmente (a diferencia de la mayoría de las matemáticas que se pueden hacer directamente con la CPU)

Ni siquiera sé si codificarlo a mano en el montaje te dará una ganancia de rendimiento de más de 10 veces, eso es bastante cercano. Buscaría otras formas de optimizarlo; a veces, dependiendo de su problema matemático, hay pequeños trucos que puede hacer para hacerlo más rápido.


Utilicé Biginteger en un trabajo anterior. No sé qué tipo de rendimiento necesita. No lo usé en una situación de alto rendimiento, pero nunca tuve ningún problema con eso.


Ver las respuestas en este thread . Tendrá que usar una de las librerías / clases de enteros grandes de terceros disponibles o esperar C # 4.0 que incluirá un tipo de datos BigInteger nativo.


F# también se envía con uno. Puede obtenerlo en Microsoft.FSharp.Math .