Estoy tratando de pensar en cómo haría los cálculos en números extremadamente grandes (hasta el infinito - no hay números flotantes) si la construcción del lenguaje es incapaz de manejar números mayores que un cierto valor.
Estoy seguro de que no soy el primero ni el último en hacer esta pregunta, pero los términos de búsqueda que estoy usando no me están dando un algoritmo para manejar esas situaciones. Más bien, la mayoría de las sugerencias ofrecen un cambio de idioma o un cambio variable, o hablan de cosas que parecen irrelevantes para mi búsqueda. Entonces necesito un poco de orientación.
Dibujaría un algoritmo como este:
Determine la longitud máxima de la variable entera para el idioma.
Si un número tiene más de la mitad de la longitud máxima de la variable, se divide en una matriz. (dar una pequeña sala de juegos)
Orden de matriz [0] = los números más a la derecha [n-max] = los números más a la izquierda
Ex. Num: 29392023 Matriz [0]: 23, Matriz [1]: 20, matriz [2]: 39, matriz [3]: 29
Como establecí la mitad de la longitud de la variable como el punto de marca, puedo calcular las unidades, décimas, centésimas, etc. Colocar a través de la marca de la mitad, de modo que si una longitud máxima variable fuera de 10 dígitos de 0 a 9999999999, sé que al dividir eso a cinco dígitos me da un poco de sala de juegos
Entonces, si sumo o multiplico, puedo tener una función de verificación variable que vea que el sexto dígito (desde la derecha) de la matriz [0] es el mismo lugar que el primer dígito (desde la derecha) de la matriz [1].
Dividir y restar tiene sus propios problemas que aún no he pensado.
Me gustaría saber acerca de las mejores implementaciones para soportar números más grandes que el programa.
fuente
Respuestas:
Está buscando una biblioteca de aritmética de precisión arbitraria (también llamada "precisión múltiple" o "gran número") para el idioma con el que está trabajando. Por ejemplo, si está trabajando con C, puede usar la Biblioteca GNU Bignum -> http://gmplib.org/
Si desea comprender cómo funciona, también puede escribir su propia biblioteca de números grandes y usarla. La forma más sencilla de manejar esto es con matrices, donde cada elemento es un dígito del número con el que está trabajando. Después de eso, debe implementar todas las funciones para sumar, restar, multiplicar, dividir, exponer y así sucesivamente.
fuente
Es un problema bien conocido: aritmética de precisión arbitraria
Cuando el idioma que está utilizando no resuelve este problema, primero intente encontrar una biblioteca de terceros que lo haga. Si no lo encuentra o tiene curiosidad, intente implementarlo; El artículo de Wikipedia tiene buenas referencias a implementaciones clásicas.
fuente
Cuando se trata de grandes números, probablemente una de las decisiones de diseño más fundamentales es cómo voy a representar el gran número.
¿Será una cadena, una matriz, una lista o una clase de almacenamiento personalizada (local).
Después de tomar esa decisión, las operaciones matemáticas reales pueden desglosarse en partes más pequeñas y luego ejecutarse con tipos de idioma nativo como int o integer.
He incluido un muy rudimentario ejemplo de ADICIÓN en C # .Net que almacena el gran número resultante como una cadena. Los "números" entrantes también son cadenas, por lo que uno debería poder enviar números muy "grandes". Tenga en cuenta que el ejemplo es solo para números enteros para que sea simple.
Incluso con cadenas hay un límite en el número de caracteres o "números" en el número, como se indica aquí:
¿Cuál es la longitud máxima posible de una cadena .NET?
Pero podría agregar algunos números realmente grandes, mucho más allá de los tipos nativos int32 o int64 para .Net.
De todos modos, aquí hay una implementación de almacenamiento de cadenas.
Espero que eso te dé algunas ideas sobre tu propia implementación. Tenga en cuenta que el código de muestra probablemente no esté optimizado ni nada de eso. Está destinado a dar algunas ideas de cómo podría hacerse.
fuente
Este funciona más rápido para mí:
fuente