Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aritmtica multiprecisin
Objetivo
El objetivo de esta prctica es presentar algunas nociones acerca de las operaciones aritmticas
multiprecisin tambin conocidas como de precisin arbitraria o bignum (del ingls big number o nmero grande).
Para alcanzar este objetivo, se propone la programacin de operaciones bsicas con enteros de tamao
arbitrario. Concretamente, trabajaremos con operaciones de suma y resta sobre nmeros representados en BCD y en
binario. Tambin se propone realizar desplazamientos unitarios a derecha e izquierda sobre nmeros binarios.
Operaciones aritmticas
Puesto que los operadores de que dispone el procesador se ajustan al tamao palabra, las operaciones
aritmticas sobre nmeros de precisin arbitraria se descomponen en una sucesin de operaciones de dicho tamao
teniendo cuidado de proporcionar a la etapa siguiente la informacin necesaria para mantener el significado
numrico. Es decir, cada operacin sobre una componente del operando debe suministrar el acarreo correspondiente
a la siguiente.
En la figura, se ilustra el hecho de que la operacin i-sima entre componentes del nmero de precisin
arbitraria debe tener en cuenta el acarreo de la operacin i1-sima.
ARITMTICA MULTIPRECISIN
A tener en cuenta
Lgicamente, adems de realizar la operacin aritmtica requerida, hemos de tener en cuenta algunos
aspectos adicionales. El primero de ellos es que tanto los operandos como el resultado deben ser alojados siempre en
memoria ya que no existe ningn registro de tamao suficiente (salvo que algn operando no sea bignum).
Otro aspecto importante es la informacin que describe cmo es el resultado, es decir, si es cero, si tiene
acarreo, qu signo tiene el resultado y si se ha producido desbordamiento.
La informacin acerca del acarreo, el signo y el desbordamiento se obtiene con la ltima iteracin del
procedimiento aritmtico. La informacin de si el resultado es cero o no es consecuencia de evaluar si es cero o no
en cada una de las iteraciones. En general, el resultado slo es cero si lo es en todas y cada una de las iteraciones.
Cuando realizamos un programa para operar con nmeros de precisin arbitraria, hemos de tener en cuenta
que entre cada dos iteraciones consecutivas hemos de salvar los flags ya que el proceso de cargar componentes
nuevas, actualizar punteros, etc., puedo provocar que perdamos dicha informacin alterando los resultados.
Prcticas
A) Escriba un programa que realice un desplazamiento unitario a la izquierda sobre un nmero de
precisin arbitraria. Evale si el resultado es cero y si existe acarreo
Declare un nmero de precisin arbitraria constante en el rea de datos y otro inicializado a cero del
mismo tamao. Declare tambin una variable de tamao byte llamada acarreo y otra igual llamada cero. Ambas
estarn inicializadas con el carcter 0 y 1 respectivamente, indicando que no existe acarreo y que el resultado es
nulo.
Programe la rutina que realiza el desplazamiento unitario a la izquierda sobre componentes de tamao word
comenzando por la de menor peso. En cada iteracin salvamos el flag de acarreo para usarlo en la siguiente
iteracin. Tambin evaluamos si el resultado es nulo en esa componente observando el flag de cero. Si no es nulo,
escribimos el carcter 0 en la variable cero indicando que el resultado ya no ser nulo.
En la ltima iteracin evaluamos el acarreo. Si el flag de acarreo indica que existe, escribimos 1 en la
variable acarreo.
Una vez finalizada la operacin, podemos presentar los operandos en pantalla as como las variables
acarreo y cero. Para presentar los operandos, nos limitamos a escribir su interpretacin ASCII byte a byte no su
valor numrico. Si el valor del operando es una secuencia de bytes con el mismo carcter ASCII, es fcil comprobar
si funciona bien o no el programa. Por ejemplo, si introducimos el carcter 1, es decir, 31h, despus del clculo
deberamos tener 62h, es decir, el carcter b.
Qu habra que cambiar si el desplazamiento fuera a la derecha? Qu diferencias habra que introducir
para trabajar con representaciones con signo y sin signo?
Escriba un programa que realice la suma y resta de dos operandos de precisin arbitraria. Al igual que en el
caso anterior, adems del resultado hemos de obtener la informacin que describa el mismo, es decir, si es nulo y si
tiene acarreo.
Asumiendo que disponemos de 2 nmeros representados en BCD desempaquetado (un dgito BCD por
byte) de precisin arbitraria, escriba un programa que calcule la suma. Tenga en cuenta que hay que utilizar las
instrucciones de ajuste ASCII. No olvide el acarreo y dar cuenta de si el resultado es nulo o no lo es.
Los nmeros en BCD de precisin arbitraria se pueden declarar como constantes en el rea de datos o bien
se pueden capturar desde teclado.