Tema 5: Coma flotant
14.1 Representació IEEE 754
Vegeu Secció 5.1.
Problema 14.1 En una arquitectura de von Neumann, els grups de bits no tenen un significat específic per si mateixos: el seu significat depèn totalment de com es facin servir. Suposeu els valors A = 0x407302B3 i B = 0xF9C40513. Contesteu les preguntes següents fent diverses suposicions sobre A i B:
- Si són naturals, quin és el seu valor en decimal?
- Si són enters en complement a 2, quin és el seu valor en decimal?
- Si són nombres en coma flotant de precisió simple, quin és el seu valor en decimal?
- Si són instruccions RISC-V, quina instrucció representen en assemblador?
Problema 14.2 Convertiu a decimal els valors següents suposant que codifiquen nombres en format IEEE 754 de precisió simple:
0x3FB080000x800000000xB0FC00000xC2968000
Problema 14.3 La taula següent conté una llista de nombres binaris en format IEEE 754 de precisió simple. Marqueu amb una X la casella corresponent al tipus de valor de cada un, d’acord amb la notació: NRM = normalitzat; DNRM = subnormal; 0 = zero; INF = infinit; NaN = Not a Number.
| Signe | Exponent | Fracció | NRM | DNRM | 0 | INF | NaN |
|---|---|---|---|---|---|---|---|
| 0 | 0000 0000 |
110 0010 0000 1110 1110 1011 |
|||||
| 0 | 0000 0000 |
000 0000 0000 0000 0000 0000 |
|||||
| 0 | 0010 0100 |
000 0000 0000 0000 0000 0000 |
|||||
| 1 | 1111 1111 |
000 0000 0000 0000 0000 0000 |
|||||
| 0 | 0010 0100 |
110 0010 0000 1110 1110 1011 |
|||||
| 1 | 0000 0000 |
000 0000 0000 0000 0000 0000 |
|||||
| 0 | 1111 1111 |
101 0001 0001 0000 1001 0100 |
Problema 14.4 En el format de coma flotant IEEE 754 de precisió simple:
- Quin és el nombre positiu més gran representable? Expresseu el resultat en notació exponencial i en hexadecimal.
- Quin és el nombre positiu no nul més petit representable en format normalitzat? Expresseu el resultat en notació exponencial i en hexadecimal.
- Quin és el nombre positiu no nul més petit representable en format subnormal? Expresseu el resultat en notació exponencial i en hexadecimal.
Problema 14.5 Convertiu els nombres decimals següents al format de coma flotant IEEE 754 de precisió simple, expressant el resultat en hexadecimal. Determineu en cada cas si es comet error per pèrdua de precisió i, en cas afirmatiu, calculeu-ne el valor en decimal:
- 340
- 44,4
- −255,125
- −10,75
- 6,5
Problema 14.6 Donats els nombres decimals \(A = -1609{,}5\) i \(B = -938{,}8125\):
- Convertiu-los al format IEEE 754 de precisió simple, expressant el resultat en hexadecimal, i calculeu l’error comès per pèrdua de precisió expressat en decimal.
- Convertiu-los al format IEEE 754 de precisió doble, expressant el resultat en hexadecimal, i calculeu l’error comès per pèrdua de precisió expressat en decimal.
Problema 14.7 Els processadors gràfics usen un format de coma flotant de 16 bits anomenat half, similar al de precisió simple, excepte que l’exponent té 5 bits (esbiaixat, biaix 15) i la fracció en té 10 (amb bit ocult, com a precisió simple: la mantissa en té 11). Convertiu els nombres decimals següents a la representació half en hexadecimal:
- \(A = -1{,}278 \times 10^3\), \(B = -3{,}90625 \times 10^{-1}\)
- \(A = 2{,}3109375 \times 10^1\), \(B = 6{,}3916015625 \times 10^{-1}\)
- \(A = 6{,}18 \times 10^2\), \(B = 5{,}79375 \times 10^1\)
- \(A = -1{,}6360 \times 10^4\), \(B = 1{,}6360 \times 10^4\), \(C = 1{,}0\)
Problema 14.8 Convertiu els nombres decimals següents al format half de 16 bits (vegeu Problema 14.7) i expresseu el resultat en hexadecimal:
- \(A = 2{,}865625 \times 10^1\), \(B = 4{,}140625 \times 10^{-1}\), \(C = 1{,}2140625 \times 10^1\)
- \(A = 1{,}5234375 \times 10^{-1}\), \(B = 2{,}0703125 \times 10^{-1}\), \(C = 9{,}96875 \times 10^1\)
- \(A = -2{,}7890625 \times 10^1\), \(B = -8{,}088 \times 10^3\), \(C = 1{,}0216 \times 10^4\)
14.2 Operacions
Vegeu Secció 5.2 i Secció 5.3.
Problema 14.9 Suposeu que els registres de coma flotant ft2 = 0x417AC000 i ft4 = 0x3F140000, i que s’executa la instrucció RISC-V fadd.s ft6, ft2, ft4. Amb arrodoniment al més pròxim (al parell en cas equidistant):
- Calculeu a mà, seguint l’algorisme de suma de nombres en coma flotant, el valor final de
ft6en hexadecimal. - Es produeix algun error de precisió en el resultat?
- Convertiu a decimal el valor final de
ft6.
Problema 14.10 Suposeu que ft2 = 0xC076C000 i ft4 = 0x3ECA8000, i que s’executa fadd.s ft6, ft2, ft4. Amb arrodoniment al més pròxim (al parell en cas equidistant):
- Calculeu a mà el valor final de
ft6en hexadecimal. - Es produeix algun error de precisió?
- Convertiu a decimal el valor final de
ft6.
Problema 14.11 Suposeu que ft2 = 0x42000000 i ft4 = 0x3D800000, i que s’executa fmul.s ft6, ft2, ft4. Suposant arrodoniment al més pròxim (al parell en cas equidistant), quin és el valor final de ft6 en hexadecimal?
Problema 14.12 Suposeu els nombres \(A\) i \(B\) en format half de 16 bits (vegeu Problema 14.7). Amb un sumador amb bit de guarda, d’arrodoniment i sticky, i arrodoniment al més pròxim (al parell en cas equidistant):
- Calculeu a mà \(A + B\) suposant
A = 0xE4FEiB = 0xB640. Doneu el resultat en hexadecimal i en decimal. Quina és la precisió del resultat? - Ídem amb
A = 0x4DC7iB = 0x391D.
Problema 14.13 Suposeu els nombres \(A\) i \(B\) en format half de 16 bits. Amb arrodoniment al més pròxim (al parell en cas equidistant):
- Calculeu a mà \(A \times B\) suposant
A = 0x45A9iB = 0x484C. Doneu el resultat en hexadecimal i en decimal. Quina és la precisió del resultat? - Ídem amb
A = 0x60D4iB = 0x533E.
Problema 14.14 Suposeu els nombres \(A\) i \(B\) en format half de 16 bits. Amb arrodoniment al més pròxim (al parell en cas equidistant):
- Calculeu a mà \(A / B\) suposant
A = 0xEA60iB = 0xE000. Doneu el resultat en hexadecimal i en decimal. - Ídem amb
A = 0xCD98iB = 0x6400.
Problema 14.15 Suposant que f i g són variables de tipus float emmagatzemades als registres de coma flotant fa2 i fa4, traduïu a assemblador RISC-V les sentències en C següents. Tingueu en compte que l’assemblador només admet literals fraccionaris a les directives de dades (.float), mai com a operands d’instrucció:
f = 3.14;f = g;f = g + 3.14;
Problema 14.16 Traduïu a assemblador RISC-V la subrutina absdif:
Problema 14.17 Donades les declaracions de funcions:
C
- Quines variables locals és convenient guardar al bloc d’activació i quines és més convenient guardar en registres? Quins registres caldrà preservar a la pila abans de cada crida a
mitjana? - Traduïu a assemblador RISC-V la funció
variancia.
Problema 14.18 Suposeu els nombres \(A\) i \(B\) en format half de 16 bits emmagatzemats a t1 i t2. Escriviu programes en assemblador RISC-V que:
- Calculin la suma \(A = A + B\).
- Calculin el producte \(A = A \times B\) i indiquin si s’ha produït desbordament o subdesbordament.
Problema 14.19 Donades les declaracions en C:
Escriviu en assemblador RISC-V (extensió F) el fragment de codi que:
- Llegeixi els elements
v[0]iv[2]de la memòria i els deixi als registres de coma flotantfa0ifa1respectivament. - Calculi la suma
fa0 + fa1i l’escrigui aresultat. - Compari
v[0]iv[2]i deixi at0el valor 1 siv[0] > v[2], o 0 altrament (useuflt.s).
Problema 14.20 Escriviu en assemblador RISC-V les sentències equivalents a les conversions en C següents. Useu les instruccions fcvt.w.s, fcvt.wu.s, fcvt.s.w i fcvt.s.wu segons convingui.
int i = (int) f;— onfés unfloatafa0iiés unintaa0.float f = (float) i;— oniés aa0ifha d’anar afa0.unsigned int u = (unsigned int) f;— onfés afa0iuha d’anar aa0.- Per a
f = 3.9, calculeu a mà el resultat de l’apartat a) i expliqueu si es produeix truncament o arrodoniment.
14.3 No-associativitat
Vegeu Secció 5.2.3.
Problema 14.21 Suposeu els nombres \(A\), \(B\) i \(C\) en format half de 16 bits. Amb un sumador amb bit de guarda, d’arrodoniment i sticky, i arrodoniment al més pròxim (al parell en cas equidistant):
- Suposant
A = 0xF3FD,B = 0x73FDiC = 0x3C00, calculeu a mà \((A + B) + C\) i \(A + (B + C)\). Doneu els resultats en hexadecimal i en decimal. Es pot afirmar que \((A + B) + C = A + (B + C)\)? - Feu la mateixa comprovació amb
A = 0x4F2A,B = 0x36A0iC = 0x4A12.
Problema 14.22 Suposeu els nombres \(A\), \(B\) i \(C\) en format half de 16 bits. Amb arrodoniment al més pròxim (al parell en cas equidistant):
- Suposant
A = 0x30E0,B = 0x32A0iC = 0x563B, calculeu a mà \(A \times (B + C)\) i \((A \times B) + (A \times C)\). Doneu els resultats en hexadecimal i en decimal. Es pot afirmar que \(A \times (B + C) = (A \times B) + (A \times C)\)? - Feu la mateixa comprovació amb
A = 0xCEF9,B = 0xEFE6iC = 0x70FD.