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:

  1. Si són naturals, quin és el seu valor en decimal?
  2. Si són enters en complement a 2, quin és el seu valor en decimal?
  3. Si són nombres en coma flotant de precisió simple, quin és el seu valor en decimal?
  4. 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:

  1. 0x3FB08000
  2. 0x80000000
  3. 0xB0FC0000
  4. 0xC2968000

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:

  1. Quin és el nombre positiu més gran representable? Expresseu el resultat en notació exponencial i en hexadecimal.
  2. Quin és el nombre positiu no nul més petit representable en format normalitzat? Expresseu el resultat en notació exponencial i en hexadecimal.
  3. 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:

  1. 340
  2. 44,4
  3. −255,125
  4. −10,75
  5. 6,5

Problema 14.6 Donats els nombres decimals \(A = -1609{,}5\) i \(B = -938{,}8125\):

  1. 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.
  2. 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:

  1. \(A = -1{,}278 \times 10^3\), \(B = -3{,}90625 \times 10^{-1}\)
  2. \(A = 2{,}3109375 \times 10^1\), \(B = 6{,}3916015625 \times 10^{-1}\)
  3. \(A = 6{,}18 \times 10^2\), \(B = 5{,}79375 \times 10^1\)
  4. \(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:

  1. \(A = 2{,}865625 \times 10^1\), \(B = 4{,}140625 \times 10^{-1}\), \(C = 1{,}2140625 \times 10^1\)
  2. \(A = 1{,}5234375 \times 10^{-1}\), \(B = 2{,}0703125 \times 10^{-1}\), \(C = 9{,}96875 \times 10^1\)
  3. \(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):

  1. Calculeu a mà, seguint l’algorisme de suma de nombres en coma flotant, el valor final de ft6 en hexadecimal.
  2. Es produeix algun error de precisió en el resultat?
  3. 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):

  1. Calculeu a mà el valor final de ft6 en hexadecimal.
  2. Es produeix algun error de precisió?
  3. 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):

  1. Calculeu a mà \(A + B\) suposant A = 0xE4FE i B = 0xB640. Doneu el resultat en hexadecimal i en decimal. Quina és la precisió del resultat?
  2. Ídem amb A = 0x4DC7 i B = 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):

  1. Calculeu a mà \(A \times B\) suposant A = 0x45A9 i B = 0x484C. Doneu el resultat en hexadecimal i en decimal. Quina és la precisió del resultat?
  2. Ídem amb A = 0x60D4 i B = 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):

  1. Calculeu a mà \(A / B\) suposant A = 0xEA60 i B = 0xE000. Doneu el resultat en hexadecimal i en decimal.
  2. Ídem amb A = 0xCD98 i B = 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ó:

  1. f = 3.14;
  2. f = g;
  3. f = g + 3.14;

Problema 14.16 Traduïu a assemblador RISC-V la subrutina absdif:

C
float absdif(float a, float b) {
    if (a > b)
        return a - b;
    else
        return b - a;
}

Problema 14.17 Donades les declaracions de funcions:

C
float mitjana(float p[]);

float variancia(float vec[]) {
    int   i;
    float m, q;
    float vquadrats[100];
    for (i = 0; i < 100; i++)
        vquadrats[i] = vec[i] * vec[i];
    q = mitjana(vquadrats);
    m = mitjana(vec);
    return q - m * m;
}
  1. 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?
  2. 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:

  1. Calculin la suma \(A = A + B\).
  2. 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:

C
float v[4] = {1.5, -2.0, 3.25, 0.5};
float resultat;

Escriviu en assemblador RISC-V (extensió F) el fragment de codi que:

  1. Llegeixi els elements v[0] i v[2] de la memòria i els deixi als registres de coma flotant fa0 i fa1 respectivament.
  2. Calculi la suma fa0 + fa1 i l’escrigui a resultat.
  3. Compari v[0] i v[2] i deixi a t0 el valor 1 si v[0] > v[2], o 0 altrament (useu flt.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.

  1. int i = (int) f; — on f és un float a fa0 i i és un int a a0.
  2. float f = (float) i; — on i és a a0 i f ha d’anar a fa0.
  3. unsigned int u = (unsigned int) f; — on f és a fa0 i u ha d’anar a a0.
  4. 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):

  1. Suposant A = 0xF3FD, B = 0x73FD i C = 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)\)?
  2. Feu la mateixa comprovació amb A = 0x4F2A, B = 0x36A0 i C = 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):

  1. Suposant A = 0x30E0, B = 0x32A0 i C = 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)\)?
  2. Feu la mateixa comprovació amb A = 0xCEF9, B = 0xEFE6 i C = 0x70FD.