Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Bueno, por el asunto y el resumen seguramente ya estareis imaginando de que va este tema, variables para numeros muy grandes, enormes, de un numero de bits que decida el programador en el momento de programar (y si es posible de un numero de bits que se decida en ejecucion mejor).
Ya tengo conocimientos de programacion en C, y he echo algunos programillas que de momento no han sido gran cosa, he usado la libreria SDL y como anotacion personal me encanta la informatica y cada vez me gustaria programar teniendo mas control sobre lo que programo (a ver si algun dia me animo y me paso por la seccion de ensamblador de este foro para aprender un poco).
Lo que me gustaria saber hacer en C, entre otras cosas, es poder manejar numeros mas grandes de lo que me permite un long o un unsigne long, ¿alguien sabe como o almenos por donde podria empezar a afrontar esta cuestion de variables de numeros grandes?, se que hay multitud de librerias en la red, para esto, para lo otro...; pero me gustaria (igual que hay quien se pone ha hacer librerias ya sea en ensamblador o en C o c++) hacerlo mediante C sin necesidad de usar librerias, se que ahorran trabajo pero es por curiosidad y por saber como hacerlo (y que siempre viene bien saber contra más mejor, y si todos usamos librerias siempre a ver quien se pone a hacerlas despues, jejeje), dejando bromas aparte quisiera saber como manejar numeros muy grandes usando solo C, programandolo manualmente sin complementos ni librerias.
Gracias de antemano a todos por la ayuda que podais brindar y por el tiempo de leeros este tema.
P.D.: en principio no tengo un uso ahora mismo para este tema de numeros muy grandes mas que el de aprender, aunque lo mismo despues si consigo llevar a cabo esta idea de los numeros grandes puede que me anime a aplicarlo en un programa con alguna utilidad y no solo por probar, he leido algunos articulos sobre el algoritmo RSA por lo que podria ser una buena forma de poner en practica el uso de numeros grandes.
Teoría: http://en.wikipedia.org/wiki/Arbitrary- ... arithmetic
Librerías: http://en.wikipedia.org/wiki/Arbitrary- ... n_software
Seguramente los que más te interesen serán CLN o GMP pero no estoy muy seguro de que sean especialmente fáciles de usar. Yo hace tiempo probé en C# IntX y Mono.Math.BigInteger y éstas sí que eran bastante sencillas de utilizar (ojo: Mono.Math.BigInteger se distribuye con las librerías de Mono así que si estás en Linux no hay problema pero en Windows necesitas instalar Mono, no se incluyen en la implementación de Microsoft .NET).
y si todos usamos librerias siempre a ver quien se pone a hacerlas despues
Eso es una tontería. Las librerías no son vudú, se hacen cuando se necesitan y luego se utilizan para ahorrar trabajo. Que te apetezca programar una o saber cómo funciona es una cosa, pero no puedes pretender hacerlo todo desde cero porque entonces en la vida programarías nada más que operaciones aritméticas y poco más.
Si lo que interesa es aprender, prueba a creartelos tú mismo:
* usando un tipo registro:
superlong tipolargo {
parte 1: byte;
parte 2: byte;
...
parte n: byte;
}
* usando un array de bytes.
* usando punteros.
...
supongo que opciones hay muchas, ve probando.
Una vez tengas definido tu tipo "super-numero", tienes que crearte las funciones matemáticas que quieras usar (suma, resta, multiplicación, etc), teniendo en cuenta que tienes que ir operando parte a parte y arrastrando los acarreos siempre.
Eso es una tontería. Las librerías no son vudú, se hacen cuando se necesitan y luego se utilizan para ahorrar trabajo. Que te apetezca programar una o saber cómo funciona es una cosa, pero no puedes pretender hacerlo todo desde cero porque entonces en la vida programarías nada más que operaciones aritméticas y poco más.
La frase que puse no era para tomarsela al pie de la letra, era para dar a entender que esta bien hacer uso de las librerias, una vez se ha echo algo no es necesario repetirlo otra vez igual, sin embargo no creo que sea bueno estancarse en solo y unicamente usar librerias sin tener ni un minimo de curiosidad, por asi decirlo, en como han sido echas las librerias usadas, o para hablar de una forma más general, en como se hace cualquier libreria ya sea en C, en C++ en ensamblador...; no me referia que hubiera que escribir todo bit a bit siempre, aun para escribir lo mismo dos veces.
Gracias por las librerias (que segun escriba esto me paso a verlas con detenimiento).¿Ademas no sabras como los que han echo las librerias han echo para hacerlo (a ser posible en C) o de algun articulo que lo explique con algun ejemplo en C o C++?
Si lo que interesa es aprender, prueba a creartelos tú mismo:
* usando un tipo registro:
superlong tipolargo {
parte 1: byte;
parte 2: byte;
...
parte n: byte;
}
* usando un array de bytes.
* usando punteros.
...
supongo que opciones hay muchas, ve probando.
Una vez tengas definido tu tipo "super-numero", tienes que crearte las funciones matemáticas que quieras usar (suma, resta, multiplicación, etc), teniendo en cuenta que tienes que ir operando parte a parte y arrastrando los acarreos siempre.
La idea del array es la que veo mas sencilla en el momento de definirla, y mas complicada en el momento de hacer operaciones (sobre todo a partir de la division, con la exponenciacion, y ya ni hablar de la raiz cuadrada), y lo de los punteros lo pense al principio intentando definir un puntero pero no especificandole como tamaño el tamaño de un tipo de dato existente, sino una cantidad como 100 pero si no recuerdo mal me daba error al compilar por algo de poner asi el tamaño del dato al que tenia que apuntar el puntero, ¿se te ocurre alguna forma de definir un puntero que apunte a un dato de x bits de forma que se puedan usar esos x bits todos juntos, como de la misma forma que se usa si fuera un puntero a un int o un long?
Gracias por la sugerencia del array.