Este documento describe un proyecto para crear una clase BigNum en C++ que permita el manejo de números enteros de precisión infinita mediante la implementación de operaciones como suma, resta, multiplicación, división, incremento/decremento y salida. El proyecto debe cumplir con requisitos como ser modular, chequear errores y proporcionar programas de prueba para calcular 2^128, la distancia recorrida por el Enterprise, y el valor de fib(30). El proyecto debe entregarse el 9 de abril con documentación que incluya el có
1. Universidad Francisco Marroquín
F.I.S.I.C.C.
Programación III
1er semestre 1992
Prof. : Egdares Futch H.
Proyecto #4
BigNum - paquete de manejo de enteros de precisión infinita
Motivación
El lenguaje C++ permite crear fácilmente nuevos tipos de datos, que el usuario de éstos
puede manipular naturalmente como si fueran parte del lenguaje. Uno de los problemas que se
tienen en sistemas de computación es la precisión finita de los números que se manejan; por
ejemplo, si se tiene una variable de tipo int, se limita al rango -32,768..32,767, y si se tiene una
variable de tipo long, se limita al rango -4,294,967,296..4,294,967,295. En algunos casos, esto no
es suficiente, por lo que se plantea como problema el diseño de números enteros de precisión
infinita, y su manejo. Cuando se dice precisión infinita no quiere decir que sean números
infinitos, sino que el usuario puede definir la precisión que se desea, la que usualmente será
mayor que un long.
Descripción
Este proyecto está orientado a poner en práctica el lenguaje C++ en la construcción de
clases que definen sus propias operaciones.
BigNum, entonces, es un módulo de manejo de enteros de precisión infinita, el cual
permitirá expresar operaciones como 123456789823642384234 + 2346891790891235, las
cuales ningún lenguaje soporta hasta ahora. Aunque se especifica que es infinito, el límite
máximo deberá ser de 1024 dígitos. El nombre BigNum fue tomado del New Hacker's Dictionary
(MIT Press, 1991) el cual provee una nota histórica del nombre.
El proyecto consiste entonces en diseñar una clase de C++ que permita el manejo de estos
números, y permita hacer operaciones con ellos. Como existe el límite de 1024 dígitos como
máximo, la clase BigNum deberá tener chequeo de overflow.
Las operaciones disponibles deben ser :
- suma (+,+=)
- resta (-,-=)
- multiplicación (*,*=)
- división (/,/=)
- incremento/decremento (++,--)
- complemento (- unario)
- output (salida a cout sobrecargada)
Requerimientos
El programa a entregar debe cumplir con los siguientes requerimientos :
- Escrito en lenguaje C++
- No debe desperdiciar espacio y debe destruir su almacenamiento interno
- Modular, capaz de ser utilizado en varios programas (hacer .h y .cpp)
- Chequeo de errores (overflow, mal formato, etc.)
- Programas de prueba, según lo descrito posteriormente.
2. Programas de prueba
Para la entrega de este proyecto, se deberán entregar los siguientes programas de prueba:
a) powerof2.cpp calcula el valor de 2^128
b) trek.cpp calcula la distancia recorrida, en metros, por el Enterprise
a warp 9 (warp 9 = 1516c ) durante una temporada de Star Trek
normal (20 episodios de 4 "días" de duración c/u)
c) fib.cpp calcula el valor de fib(30)
Fecha de entrega y documentación a entregar
La fecha de entrega será el día jueves 9 de abril. NO habrán prórrogas de tiempo puesto
que éstas atrasan el curso. La documentación a entregar consistirá en (no folders, no clips) :
- Diskette con el proyecto (.CPP,.H, .OBJ y .EXE, 5.25" o 3.5" sin virus)
- Carátula con nombre, carnet y nombre de proyecto
- Descripción del proyecto (1 hoja máx.)
- Funcionamiento del proyecto (1 hoja máx.)
- Manual de uso del proyecto (lo necesario)
- Descripción de rutinas y procedimientos usados
- Comentarios de implementación (opcional, puede mejorar nota)
- Listados de programa
Hints
Como un ejemplo de uso, podría tomarse el siguiente :
main()
{
BigNum a("1231242342124124124124124"),b;
b = a; // asignamos
b++; // incremento en 1
b += a; // b = b + a
cout << b; // imprimimos el contenido de b
a *= 4567; // ojo
a+=BigNum("29038401275230927345072309455273458923
cout << a; // este si es un BigNum
return 0; // salimos
}