Suma y resta en coma flotante - DAC - Universidad Rey Juan Carlos
Suma y resta en coma flotante - DAC - Universidad Rey Juan Carlos
Suma y resta en coma flotante - DAC - Universidad Rey Juan Carlos
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Universidad</strong><br />
<strong>Rey</strong> <strong>Juan</strong> <strong>Carlos</strong><br />
ESTRUCTURA Y TECNOLOGÍA DE<br />
COMPUTADORES<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Luis Rincón Córcoles
Programa<br />
Bibliografía.<br />
1. Introducción.<br />
2. <strong>Suma</strong> y <strong>resta</strong> <strong>en</strong> <strong>coma</strong> <strong>flotante</strong>.<br />
3. Producto y división <strong>en</strong> <strong>coma</strong> <strong>flotante</strong>.<br />
4. Instrucciones para <strong>coma</strong> <strong>flotante</strong> <strong>en</strong> <strong>en</strong>samblador.<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
2
Bibliografía<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
D.A. PATTERSON, J.L. HENNESSY. Estructura y Diseño de Computadores.<br />
Reverté, 2000.<br />
J.L. HENNESSY, D.A. PATTERSON. Computer Architecture. Morgan<br />
Kauffman, 2003.<br />
DORMIDO, S. CANTO M.A., MIRA J., DELGADO A.E. Estructura y Tecnología<br />
de Computadores. 2ª edición. Sanz y Torres, 2000.<br />
PARHAMI, B. Computer Arithmetic. Oxford University Press, 2000.<br />
P. DE MIGUEL. Fundam<strong>en</strong>tos de los Computadores. 7ª edición. Paraninfo,<br />
1999.<br />
W. STALLINGS. Organización y Arquitectura de Computadores. 5ª edición,<br />
Pr<strong>en</strong>tice Hall, 2000.<br />
3
1. Introducción<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Los computadores utilizan dos repres<strong>en</strong>taciones claram<strong>en</strong>te difer<strong>en</strong>ciadas para<br />
cantidades numéricas:<br />
•Coma fija: para números <strong>en</strong>teros sin signo o complem<strong>en</strong>to a 2.<br />
•Coma <strong>flotante</strong> (floating point, FP): para números muy grandes o muy pequeños<br />
o con parte fraccionaria.<br />
Inicialm<strong>en</strong>te cada modelo de computador t<strong>en</strong>ía su propia manera de repres<strong>en</strong>tar<br />
números <strong>en</strong> <strong>coma</strong> <strong>flotante</strong>.<br />
•Problemas a la hora de asegurar la transportabilidad de los programas y datos.<br />
En 1977 se formó un comité de expertos del IEEE cuyo objetivo era definir un<br />
docum<strong>en</strong>to estándar para los futuros desarrollos que utilizaran <strong>coma</strong> <strong>flotante</strong>.<br />
•Finalm<strong>en</strong>te <strong>en</strong> 1985 el comité hizo oficial el estándar IEEE 754.<br />
En 1987 otro comité de expertos del IEEE propuso un estándar para <strong>coma</strong><br />
<strong>flotante</strong> indep<strong>en</strong>di<strong>en</strong>te de la base de numeración utilizada: el IEEE 854.<br />
•Este estándar no implica ninguna modificación del IEEE 754.<br />
4
Introducción<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
La <strong>coma</strong> <strong>flotante</strong> permite repres<strong>en</strong>tar los números reales <strong>en</strong> forma aproximada.<br />
•Es preciso aplicar cuidadosam<strong>en</strong>te técnicas de redondeo.<br />
•En los programas no se debe testear la igualdad de dos números <strong>en</strong> <strong>coma</strong> <strong>flotante</strong>.<br />
El estándar IEEE 754 permite formatos ext<strong>en</strong>didos para aum<strong>en</strong>tar la precisión:<br />
•Simple ext<strong>en</strong>dido: mayor precisión que el formato simple y m<strong>en</strong>or que el formato doble.<br />
•Doble ext<strong>en</strong>dido: mayor precisión que el formato doble.<br />
•Trabajar con estos formatos facilita el redondeo.<br />
Dado que la realización de operaciones con datos <strong>en</strong> <strong>coma</strong> <strong>flotante</strong> es compleja,<br />
los computadores cu<strong>en</strong>tan con circuitos específicos dedicados a ello.<br />
•Los computadores de pot<strong>en</strong>cia baja trabajaban <strong>en</strong> <strong>coma</strong> <strong>flotante</strong> mediante software.<br />
•Con el microprocesador 8086 de Intel surgieron los coprocesadores de <strong>coma</strong> <strong>flotante</strong>:<br />
chips específicos que, trabajando <strong>en</strong> paralelo con los microprocesadores, realizaban las<br />
operaciones de <strong>coma</strong> <strong>flotante</strong> (8087 y sucesivos).<br />
•Con los avances <strong>en</strong> tecnología de integración de circuitos, hace años que los<br />
coprocesadores de <strong>coma</strong> <strong>flotante</strong> se integran <strong>en</strong> el chip del microprocesador.<br />
Hay circuitos de <strong>coma</strong> <strong>flotante</strong> para operaciones de suma, <strong>resta</strong>, producto,<br />
división, raíz cuadrada, logaritmos, expon<strong>en</strong>ciales, funciones trigonométricas, etc.<br />
5
2. <strong>Suma</strong> y <strong>resta</strong> <strong>en</strong> <strong>coma</strong> <strong>flotante</strong><br />
Lo primero es desempaquetar los operandos (dividirlos <strong>en</strong> campos).<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Después hay que igualar los expon<strong>en</strong>tes de los dos operandos.<br />
•Se calcula k =⏐Exp A – Exp B ⏐ y se desplaza la mantisa de m<strong>en</strong>or expon<strong>en</strong>te k lugares<br />
hacia la derecha.<br />
A continuación, se suman o se <strong>resta</strong>n las mantisas M A y M B.<br />
•La mantisa resultante M R puede no estar normalizada.<br />
•El expon<strong>en</strong>te resultante Exp R es el mayor de los dos operandos fu<strong>en</strong>te.<br />
Después se normaliza M R y se modifica Exp R si es preciso (postnormalización).<br />
Se comprueba que el expon<strong>en</strong>te resultante está <strong>en</strong> el rango permitido.<br />
•Si ExpR Expmax ± infinito: poner valor especial y empaquetar.<br />
•En ambos casos podría g<strong>en</strong>erarse una excepción.<br />
Se redondea la mantisa M R (<strong>en</strong> este punto M R se puede desnormalizar).<br />
•Si M R se desnormaliza, hay que volver al paso de postnormalización.<br />
•Si M R sigue normalizada, empaquetar el resultado (unir los campos) y salir.<br />
6
<strong>Suma</strong> y <strong>resta</strong> <strong>en</strong> <strong>coma</strong> <strong>flotante</strong><br />
En la etapa de inicio hay que<br />
desempaquetar los operandos<br />
originales.<br />
En la etapa final hay que<br />
empaquetar el resultado,<br />
respetando los anchos<br />
especificados por el estándar y<br />
eliminando la parte <strong>en</strong>tera de la<br />
mantisa.<br />
No<br />
Inicio<br />
Alinear las mantisas<br />
<strong>Suma</strong>r/<strong>resta</strong>r las<br />
mantisas<br />
Normalizar la mantisa<br />
resultante<br />
¿Expon<strong>en</strong>te mayor<br />
que el máximo?<br />
No<br />
¿Expon<strong>en</strong>te m<strong>en</strong>or<br />
que el mínimo?<br />
No<br />
Redondear la<br />
mantisa resultante<br />
¿Todavía está<br />
normalizada?<br />
Sí<br />
Fin<br />
Sí<br />
Sí<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Repres<strong>en</strong>tar número <strong>en</strong><br />
forma desnormalizada<br />
Infinito positivo<br />
o negativo<br />
7
<strong>Suma</strong> y <strong>resta</strong> <strong>en</strong> <strong>coma</strong> <strong>flotante</strong><br />
Sign Expon<strong>en</strong>t Significand Sign Expon<strong>en</strong>t Significand<br />
Small ALU<br />
Expon<strong>en</strong>t<br />
differ<strong>en</strong>ce<br />
0 1 0 1<br />
Control<br />
0 1<br />
Increm<strong>en</strong>t or<br />
decrem<strong>en</strong>t<br />
Shift right<br />
Big ALU<br />
Shift left or right<br />
Rounding hardware<br />
0 1<br />
Sign Expon<strong>en</strong>t Significand<br />
0 1<br />
Compare<br />
expon<strong>en</strong>ts<br />
Shift smaller<br />
number right<br />
Add<br />
Normalize<br />
Round<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
En función del signo<br />
de las mantisas de los<br />
operandos y del tipo de<br />
operación, el circuito de<br />
control seleccionará la<br />
UAL grande para<br />
realizar una suma o<br />
una <strong>resta</strong>.<br />
La UAL pequeña<br />
simplem<strong>en</strong>te <strong>resta</strong> los<br />
expon<strong>en</strong>tes para<br />
calcular la longitud del<br />
desplazami<strong>en</strong>to que<br />
hay que aplicar a la<br />
mantisa del número con<br />
m<strong>en</strong>or módulo.<br />
8
<strong>Suma</strong> y <strong>resta</strong> <strong>en</strong> <strong>coma</strong> <strong>flotante</strong><br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Al desempaquetar operandos normalizados es preciso incluir el bit implícito<br />
como parte <strong>en</strong>tera de la mantisa, que no estaba almac<strong>en</strong>ado <strong>en</strong> el dato original.<br />
•Como M R ∈ (-4,4), usaremos dos bits para el módulo de la parte <strong>en</strong>tera de las mantisas<br />
fu<strong>en</strong>te (que t<strong>en</strong>drán la forma: s01’...) y para la mantisa resultado.<br />
Dado que el resultado de la operación puede estar desnormalizado, el paso de<br />
postnormalización exige un circuito complejo.<br />
•El increm<strong>en</strong>tador / decrem<strong>en</strong>tador para postnormalizar será un sumador / <strong>resta</strong>dor.<br />
La UAL grande t<strong>en</strong>drá que g<strong>en</strong>erar resultados de al m<strong>en</strong>os 1+2+m+t bits:<br />
•El primer bit sería el de signo.<br />
•Los dos sigui<strong>en</strong>tes serían para la parte <strong>en</strong>tera de la mantisa.<br />
•Los m sigui<strong>en</strong>tes serían para el ancho almac<strong>en</strong>able de la parte <strong>en</strong>tera de la mantisa.<br />
•Los últimos t bits serían para redondear.<br />
La UAL pequeña admitiría operandos de n+1 bits (n: ancho del expon<strong>en</strong>te).<br />
9
3. Producto <strong>en</strong> <strong>coma</strong> <strong>flotante</strong><br />
expa<br />
A = m ⋅2<br />
+<br />
B = m<br />
a<br />
b<br />
⋅2<br />
exp<br />
b<br />
R<br />
= A ⋅B<br />
=<br />
expa<br />
expB<br />
( m ⋅m<br />
) ⋅2<br />
Lo primero es desempaquetar los operandos (dividirlos <strong>en</strong> campos).<br />
a<br />
b<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Después se pued<strong>en</strong> realizar las dos operaciones sigui<strong>en</strong>tes <strong>en</strong> paralelo:<br />
•<strong>Suma</strong>r los expon<strong>en</strong>tes Exp A y Exp B para obt<strong>en</strong>er Exp R .<br />
•Multiplicar las mantisas M A y M B para obt<strong>en</strong>er M R .<br />
Después se normaliza M R ajustando Exp R si es preciso.<br />
Se comprueba que el expon<strong>en</strong>te resultante está <strong>en</strong> el rango permitido.<br />
•Si ExpR Expmax ± infinito: empaquetar y salir.<br />
•En ambos casos podría g<strong>en</strong>erarse una excepción.<br />
Se redondea la mantisa M R.<br />
•Si M R se desnormaliza, hay que volver al paso de normalización.<br />
•Si M R sigue normalizada, empaquetar el resultado y salir.<br />
10
División <strong>en</strong> <strong>coma</strong> <strong>flotante</strong><br />
expa<br />
A =<br />
ma<br />
⋅2<br />
A ma<br />
expa<br />
−<br />
B = m<br />
b<br />
⋅2<br />
exp<br />
b<br />
Lo primero es desempaquetar los operandos (dividirlos <strong>en</strong> campos).<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Después se pued<strong>en</strong> realizar las dos operaciones sigui<strong>en</strong>tes <strong>en</strong> paralelo:<br />
•Restar los expon<strong>en</strong>tes Exp A y Exp B para obt<strong>en</strong>er Exp R .<br />
•Dividir las mantisas M A y M B para obt<strong>en</strong>er M R .<br />
Después se normaliza M R ajustando Exp R si es preciso (postnormalización).<br />
Se comprueba que el expon<strong>en</strong>te resultante está <strong>en</strong> el rango permitido.<br />
•Si ExpR Expmax ± infinito: empaquetar y salir (¿producir excepción?).<br />
Se redondea la mantisa M R.<br />
•Si M R se desnormaliza, hay que volver al paso de normalización.<br />
•Si M R sigue normalizada, empaquetar el resultado y salir.<br />
R<br />
=<br />
B<br />
=<br />
m<br />
b<br />
⋅2<br />
exp<br />
B<br />
11
Producto y división <strong>en</strong> <strong>coma</strong> <strong>flotante</strong><br />
En la etapa de inicio hay que<br />
desempaquetar los operandos<br />
originales.<br />
Habitualm<strong>en</strong>te se trabaja con<br />
mantisas normalizadas, para lo<br />
cual es necesario:<br />
•Normalizar los operandos que<br />
estén desnormalizados.<br />
•Contar con un bit más para<br />
ampliar el rango del<br />
expon<strong>en</strong>te.<br />
En la etapa final hay que<br />
empaquetar el resultado,<br />
respetando los anchos<br />
especificados por el estándar y<br />
eliminando la parte <strong>en</strong>tera de la<br />
mantisa.<br />
No<br />
Inicio<br />
<strong>Suma</strong>r/<strong>resta</strong>r los<br />
expon<strong>en</strong>tes<br />
Multiplicar/dividir las<br />
mantisas<br />
Normalizar la mantisa<br />
resultante<br />
¿Expon<strong>en</strong>te mayor<br />
que el máximo?<br />
No<br />
¿Expon<strong>en</strong>te m<strong>en</strong>or<br />
que el mínimo?<br />
No<br />
Redondear la<br />
mantisa resultante<br />
¿Todavía está<br />
normalizada?<br />
Sí<br />
Fin<br />
Sí<br />
Sí<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Repres<strong>en</strong>tar número <strong>en</strong><br />
forma desnormalizada<br />
Infinito positivo<br />
o negativo<br />
12
Producto y división <strong>en</strong> <strong>coma</strong> <strong>flotante</strong><br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
Las dos operaciones son similares, con lo cual gran parte del circuito para<br />
ambas puede ser común:<br />
•Un sumador / <strong>resta</strong>dor para los expon<strong>en</strong>tes como la UAL pequeña del<br />
circuito de suma / <strong>resta</strong> (sumador para el producto, <strong>resta</strong>dor para la división).<br />
•Un multiplicador <strong>en</strong> <strong>coma</strong> fija que admita operandos fu<strong>en</strong>te de m+1 bits (m:<br />
ancho de la mantisa almac<strong>en</strong>ada).<br />
•Un divisor <strong>en</strong> <strong>coma</strong> fija que admita operandos de m+1 bits.<br />
Si las mantisas están normalizadas se facilita la postnormalización, ya que:<br />
•El módulo de la mantisa producto estará <strong>en</strong> el rango [1,4).<br />
•El módulo de la mantisa coci<strong>en</strong>te estará <strong>en</strong> el rango [1/2,2).<br />
Por tanto, puede ser conv<strong>en</strong>i<strong>en</strong>te normalizar previam<strong>en</strong>te las mantisas fu<strong>en</strong>te<br />
que estén desnormalizadas:<br />
•A la hora de operar, se añadiría un bit a la repres<strong>en</strong>tación interna del<br />
expon<strong>en</strong>te.<br />
13
MIPS<br />
Circuitos para <strong>coma</strong> <strong>flotante</strong><br />
4. Instrucciones <strong>en</strong>samblador para <strong>coma</strong> <strong>flotante</strong><br />
Ti<strong>en</strong>e instrucciones de <strong>coma</strong> <strong>flotante</strong>, ejecutadas por el coprocesador 1 (que se<br />
<strong>en</strong>cu<strong>en</strong>tra d<strong>en</strong>tro del microprocesador).<br />
Los nemotécnicos son similares a las operaciones con <strong>en</strong>teros con signo, pero<br />
con un sufijo indicativo de la precisión de los operandos:<br />
•Precisión simple: .s<br />
•Precisión doble: .d<br />
14