diff --git a/slides/cours_5.md b/slides/cours_5.md new file mode 100644 index 0000000000000000000000000000000000000000..42e99d46cefdd0a6110adfed9c8060ed1f07aec4 --- /dev/null +++ b/slides/cours_5.md @@ -0,0 +1,819 @@ +--- +title: "Représentation des nombres et récursivité" +date: "2022-11-02" +--- + +# Types énumérés (1/2) + +* Un **type énuméré**: ensemble de *variantes* (valeurs constantes). +* En `C` les variantes sont des entiers numérotés à partir de 0. + + ```C + enum days { + monday, tuesday, wednesday, + thursday, friday, saturday, sunday + }; + ``` +* On peut aussi donner des valeurs "custom" + + ```C + enum days { + monday = 2, tuesday = 8, wednesday = -2, + thursday = 1, friday = 3, saturday = 12, sunday = 9 + }; + ``` +* S'utilise comme un type standard et un entier + + ```C + enum days d = monday; + (d + 2) == tuesday + tuesday; // true + ``` + +# Types énumérés (2/2) + +* Très utile dans les `switch ... case`{.C} + + ```C + enum days d = monday; + switch (d) { + case monday: + // trucs + break; + case tuesday: + printf("0 ou 1\n"); + break; + } + ``` +* Le compilateur vous prévient qu'il en manque! + +# Utilisation des types énumérés + +## Réusiner votre couverture de la reine avec des `enum` + +# Représentation des nombres (1/2) + +* Le nombre `247`. + +## Nombres décimaux: Les nombres en base 10 + ++--------+--------+--------+ +| $10^2$ | $10^1$ | $10^0$ | ++--------+--------+--------+ +| `2` | `4` | `7` | ++--------+--------+--------+ + +$$ +247 = 2\cdot 10^2 + 4\cdot 10^1 + 7\cdot 10^0. +$$ + +# Représentation des nombres (2/2) + +* Le nombre `11110111`. + +## Nombres binaires: Les nombres en base 2 + ++-------+-------+-------+-------+-------+-------+-------+-------+ +| $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| `1` | `1` | `1` | `1` | `0` | `1` | `1` | `1` | ++-------+-------+-------+-------+-------+-------+-------+-------+ + +$$ +1\cdot 2^7 + 1\cdot 2^6 +1\cdot 2^5 +1\cdot 2^4 +0\cdot 2^3 +1\cdot 2^2 ++1\cdot 2^1 +1\cdot 2^0 +$$ + +. . . + +$$ += 247. +$$ + +# Conversion de décimal à binaire (1/2) + +## Convertir 11 en binaire? + +. . . + +* On décompose en puissances de 2 en partant de la plus grande possible + + ``` + 11 / 8 = 1, 11 % 8 = 3 + 3 / 4 = 0, 3 % 4 = 3 + 3 / 2 = 1, 3 % 2 = 1 + 1 / 1 = 1, 1 % 1 = 0 + ``` +* On a donc + + $$ + 1011 \Rightarrow 1\cdot 2^3 + 0\cdot 2^2 + 1\cdot 2^1 + 1\cdot + 2^0=11. + $$ + +# Conversion de décimal à binaire (2/2) + +## Convertir un nombre arbitraire en binaire: 247? + +* Par groupe établir un algorithme. + +. . . + +## Algorithme + +1. Initialisation + + ```C + num = 247 + while (2^N < num) { + N += 1 + } + ``` + +. . . + +2. Boucle + + ```C + while (N >= 0) { + bit = num / 2^N + num = num % 2^N + N += 1 + } + ``` + +# Les additions en binaire + +Que donne l'addition `1101` avec `0110`? + +* L'addition est la même que dans le système décimal + + ``` + 1101 8+4+0+1 = 13 + + 0110 + 0+4+2+0 = 6 + ------- ----------------- + 10011 16+0+0+2+1 = 19 + ``` +* Les entiers sur un ordinateur ont une précision **fixée** (ici 4 bits). +* Que se passe-t-il donc ici? + +. . . + +## Dépassement de capacité: le nombre est "tronqué" + +* `10011 (19) -> 0011 (3)`. +* On fait "le tour"." + +# Entier non-signés minimal/maximal + +* Quel est l'entier non-signé maximal représentable avec 4 bit? + +. . . + +$$ +(1111)_2 = 8+4+2+1 = 15 +$$ + +* Quel est l'entier non-signé minimal représentable avec 4 bit? + +. . . + +$$ +(0000)_2 = 0+0+0+0 = 0 +$$ + +* Quel est l'entier non-signé min/max représentable avec N bit? + +. . . + +$$ +0\mbox{ et }2^N-1. +$$ + +* Donc `uint32_t?` maximal est? + +. . . + +$$ +4294967295 +$$ + + +# Les multiplications en binaire (1/2) + +Que donne la multiplication de `1101` avec `0110`? + +* L'addition est la même que dans le système décimal + + ``` + 1101 13 + * 0110 * 6 + --------- -------------- + 0000 78 + 11010 + 110100 + + 0000000 + --------- -------------- + 1001110 64+0+0+8+4+2+0 + ``` + +# Les multiplications en binaire (2/2) + +## Que fait la multiplication par 2? + +. . . + +* Décalage de un bit vers la gauche! + + ``` + 0110 + * 0010 + --------- + 0000 + + 01100 + --------- + 01100 + ``` + +. . . + +## Que fait la multiplication par $2^N$? + +. . . + +* Décalade de $N$ bits vers la gauche! + +# Entiers signés (1/2) + +Pas de nombres négatifs encore... + +## Comment faire? + +. . . + +## Solution naïve: + +* On ajoute un bit de signe (le bit de poids fort): + + ``` + 00000010: +2 + 10000010: -2 + ``` + +## Problèmes? + +. . . + +* Il y a deux zéros (pas trop grave): `10000000` et `00000000` +* Les additions différentes que pour les non-signés (très grave) + + ``` + 00000010 2 + + 10000100 + -4 + ---------- ---- + 10000110 = -6 != -2 + ``` + +# Entiers signés (2/2) + +## Beaucoup mieux + +* Complément à un: + * on inverse tous les bits: `1001 => 0110`. + +## Encore un peu mieux + +* Complément à deux: + * on inverse tous les bits, + * on ajoute 1 (on ignore les dépassements). + +. . . + +* Comment écrit-on `-4` en 8 bits? + +. . . + +``` + 4 = 00000100 + ________ + -4 => 00000100 + + 11111011 + + 00000001 + ---------- + 11111100 +``` + +# Le complément à 2 (1/2) + +## Questions: + +* Comment on écrit `+0` et `-0`? +* Comment calcule-t-on `2 + (-4)`? +* Quel est le complément à 2 de `1000 0000`? + +. . . + +## Réponses + +* Comment on écrit `+0` et `-0`? + + ``` + +0 = 00000000 + -0 = 11111111 + 00000001 = 100000000 => 00000000 + ``` +* Comment calcule-t-on `2 + (-4)`? + + ``` + 00000010 2 + + 11111100 + -4 + ---------- ----- + 11111110 -2 + ``` +* En effet + + ``` + 11111110 => 00000001 + 00000001 = 00000010 = 2. + ``` + +# Le complément à 2 (1/2) + +## Quels sont les entiers représentables en 8 bits? + +. . . + +``` +01111111 => 127 +10000000 => -128 // par définition +``` + +## Quels sont les entiers représentables sur $N$ bits? + +. . . + +$$ +-2^{N-1} ... 2^{N-1}-1. +$$ + +## Remarque: dépassement de capacité en `C` + +* Comportement indéfini! + + +# Nombres à virgule (1/3) + +## Comment manipuler des nombres à virgule? + +$$ +0.1 + 0.2 = 0.3. +$$ + +Facile non? + +. . . + +## Et ça? + +```C +#include <stdio.h> +#include <stdlib.h> +int main(int argc, char *argv[]) { + float a = atof(argv[1]); + float b = atof(argv[2]); + printf("%.10f\n", (double)(a + b)); +} +``` + +. . . + +## Que se passe-t-il donc? + +# Nombres à virgule (2/3) + +## Nombres à virgule fixe + ++-------+-------+-------+-------+-----+----------+----------+----------+----------+ +| $2^3$ | $2^2$ | $2^1$ | $2^0$ | `.` | $2^{-1}$ | $2^{-2}$ | $2^{-3}$ | $2^{-4}$ | ++-------+-------+-------+-------+-----+----------+----------+----------+----------+ +| `1` | `0` | `1` | `0` | `.` | `0` | `1` | `0` | `1` | ++-------+-------+-------+-------+-----+----------+----------+----------+----------+ + +## Qu'est-ce ça donne en décimal? + +. . . + +$$ +2^3+2^1+\frac{1}{2^2}+\frac{1}{2^4} = 8+2+0.5+0.0625=10.5625. +$$ + +## Limites de cette représentation? + +. . . + + +* Tous les nombres `> 16`. +* Tous les nombres `< 0.0625`. +* Tous les nombres dont la décimale est pas un multiple de `0.0625`. + +# Nombres à virgule (3/3) + +## Nombres à virgule fixe + +* Nombres de $0=0000.0000$ à $15.9375=1111.1111$. +* Beaucoup de "trous" (au moins $0.0625$) entre deux nombres. + +## Solution partielle? + +. . . + +* Rajouter des bits. +* Bouger la virgule. + +# Nombres à virgule flottante (1/2) + +## Notation scientifique + +* Les nombres sont représentés en terme: + * Une mantisse + * Une base + * Un exposant + +$$ +\underbrace{22.1214}_{\mbox{nombre}}=\underbrace{221214}_{\mbox{mantisse}}\cdot +{\underbrace{10}_{\mbox{base}}}{\overbrace{^{-4}}^{\mbox{exp.}}}, +$$ + +. . . + +On peut donc séparer la représentation en 2: + +* La mantisse +* L'exposant + +# Nombres à virgule flottante (2/2) + +## Quel est l'avantage? + +. . . + +On peut représenter des nombres sur énormément d'ordres de grandeur avec un +nombre de bits fixés. + +## Différence fondamentale avec la virgule fixe? + +. . . + +La précision des nombres est **variable**: + +* On a uniquement un nombre de chiffres **significatifs**. +$$ +123456\cdot 10^{23}+ 123456\cdot 10^{-23}. +$$ + +## Quel inconvénient y a-t-il? + +. . . + +Ce mélange d'échelles entraîne un **perte de précision**. + +# Nombres à virgule flottante simple précision (1/4) + +Aussi appelés *IEEE 754 single-precision binary floating point*. + +](figs/Float_example_bare.svg) + +## Spécification + +* 1 bit de signe, +* 8 bits d'exposant, +* 23 bits de mantisse. + +$$ +(-1)^{b_{31}}\cdot 2^{(b_{30}b_{29}\dots b_{23})_{2}-127}\cdot (1.b_{22}b_{21}\dots b_{0})_{2}, +$$ + +## Calculer la valeur décimale du nombre ci-dessus + +# Nombres à virgule flottante simple précision (2/4) + +](figs/Float_example.svg) + +. . . + +\begin{align} +\mbox{exposant}&=\sum_{i=0}^7 b_{23+i}2^i=2^2+2^3+2^4+2^5+2^6=124-127,\\ +\mbox{mantisse}&=1+\sum_{i=1}^{23}b_{23-i}2^{-i}=1+2^{-2}=1.25,\\ +&\Rightarrow (-1)^0\cdot 2^{-3}\cdot 1.25=0.15625 +\end{align} + +# Nombres à virgule flottante simple précision (3/4) + +## Quel nombre ne peux pas être vraiment représenté? + +. . . + +## Zéro: exception pour l'exposant + +* Si l'exposant est `00000000` (zéro) +$$ +(-1)^{\mbox{sign}}\cdot 2^{-126}\cdot 0.\mbox{mantisse}, +$$ +* Sinon si l'exposant est `00000001` à `11111110` +$$ +\mbox{valeur normale}, +$$ +* Sinon `11111111` donne `NaN`. + +# Nombres à virgule flottante simple précision (4/4) + +## Quels sont les plus petits/grands nombres positifs représentables? + +. . . + +\begin{align} +0\ 0\dots0\ 0\dots01&=2^{-126}\cdot 2^{-23}=1.4...\cdot +10^{-45},\\ +0\ 1\dots10\ 1\dots1&=2^{127}\cdot (2-2^{-23})=3.4...\cdot +10^{38}. +\end{align} + +## Combien de chiffres significatifs en décimal? + +. . . + +* 24 bits ($23 + 1$) sont utiles pour la mantisse, soit $2^{24}-1$: + * La mantisse fait $\sim2^{24}\sim 10^7$, ou encore + * Ou encore $\sim \log_{10}(2^{24})\sim 7$, +* Environ **sept** chiffres significatifs. + +# Nombres à virgule flottante double précision (64bits) + +## Spécification + +* 1 bit de signe, +* 11 bits d'exposant, +* 52 bits de mantisse. + +. . . + +## Combien de chiffres significatifs? + +* La mantisse fait $\sim 2^{53}\sim10^{16}$, +* Ou encore $\sim \log_{10}(2^{53})\sim 16$, +* Environ **seize** chiffres significatifs. + +## Plus petit/plus grand nombre représentable? + +. . . + +* Plus petite mantisse et exposant: $\sim 2^{-52}\cdot 2^{-1022}\sim 4\cdot 10^{-324}$, +* Plus grande mantisse et exposant: $\sim 2\cdot 2^{1023}\sim \cdot 1.8\cdot 10^{308}$. + +# Précision finie (1/3) + +## Erreur de représentation + +* Les nombres réels ont potentiellement un **nombre infini** de décimales + * $1/3=0.\overline{3}$, + * $\pi=3.1415926535...$. +* Les nombres à virgule flottante peuvent en représenter qu'un **nombre + fini**. + * $1/3\cong 0.33333$, erreur $0.00000\overline{3}$. + * $\pi\cong3.14159$, erreur $0.0000026535...$. + +On rencontre donc des **erreurs de représentation** ou **erreurs +d'arrondi**. + +. . . + +## Et quand on calcule? + +* Avec deux chiffres significatifs +\begin{align} +&8.9+(0.02+0.04)=8.96=9.0,\\ +&(8.9+0.02)+0.04=8.9+0.04=8.9. +\end{align} + +. . . + +## Même pas associatif! + +# Précision finie (2/3) + +## Erreur de représentation virgule flottante + +$$ +(1.2)_{10} = 1.\overline{0011}\cdot 2^0\Rightarrow 0\ 01111111\ +00110011001100110011010. +$$ +Erreur d'arrondi dans les deux derniers bits et tout ceux qui viennent +ensuite +$$ +\varepsilon_2 = (00000000000000000000011)_2. +$$ +Ou en décimal +$$ +\varepsilon_{10} = 4.76837158203125\cdot 10^{-8}. +$$ + +# Précision finie (3/3) + +## Comment définir l'égalité de 2 nombres à virgule flottante? + +. . . + +Ou en d'autres termes, pour quel $\varepsilon>0$ (appelé `epsilon-machine`) on a +$$ +1+\varepsilon = 1, +$$ +pour un nombre à virgule flottante? + +. . . + +Pour un `float` (32 bits) la différence est à +$$ +2^{-23}=1.19\cdot 10^{-7}, +$$ +Soit la précision de la mantisse. + +## Comment le mesurer (par groupe)? + +. . . + +```C +float eps = 1.0; +while ((float)1.0 + (float)0.5 * eps != (float)1.0) { + eps = (float)0.5 * eps; +} +printf("eps = %g\n", eps); +``` + +# Erreurs d'arrondi + +Et jusqu'ici on a encore pas fait d'arithmétique! + +## Multiplication avec deux chiffres significatifs, décimal + +$$ +(1.1)_{10}\cdot (1.1)_{10}=(1.21)_{10}=(1.2)_{10}. +$$ +En continuant ce petit jeu: +$$ +\underbrace{1.1\cdot 1.1\cdots 1.1}_{\mbox{10 fois}}=2.0. +$$ +Alors qu'en réalité +$$ +1.1^{10}=2.5937... +$$ +Soit une erreur de près de 1/5e! + +. . . + +## Le même phénomène se produit (à plus petite échelle) avec les `float` ou +`double`. + +# Exemple de récursivité (1/2) + +## La factorielle + +```C +int factorial(int n) { + if (n > 1) { + return n * factorial(n - 1); + } else { + return 1; + } +} +``` + +. . . + +## Que se passe-t-il quand on fait `factorial(4)`? + +. . . + +## On empile les appels + ++----------------+----------------+----------------+----------------+ +| | | | `factorial(1)` | ++----------------+----------------+----------------+----------------+ +| | | `factorial(2)` | `factorial(2)` | ++----------------+----------------+----------------+----------------+ +| | `factorial(3)` | `factorial(3)` | `factorial(3)` | ++----------------+----------------+----------------+----------------+ +| `factorial(4)` | `factorial(4)` | `factorial(4)` | `factorial(4)` | ++----------------+----------------+----------------+----------------+ + +# Exemple de récursivité (2/2) + +## La factorielle + +```C +int factorial(int n) { + if (n > 1) { + return n * factorial(n - 1); + } else { + return 1; + } +} +``` + +. . . + +## Que se passe-t-il quand on fait `factorial(4)`? + +. . . + +## On dépile les calculs + ++----------------+----------------+----------------+----------------+ +| `1` | | | | ++----------------+----------------+----------------+----------------+ +| `factorial(2)` | `2 * 1 = 2` | | | ++----------------+----------------+----------------+----------------+ +| `factorial(3)` | `factorial(3)` | `3 * 2 = 6` | | ++----------------+----------------+----------------+----------------+ +| `factorial(4)` | `factorial(4)` | `factorial(4)` | `4 * 6 = 24` | ++----------------+----------------+----------------+----------------+ + +# La récursivité (1/4) + +## Formellement + +* Une condition de récursivité - qui *réduit* les cas successifs vers... +* Une condition d'arrêt - qui retourne un résultat + +## Pour la factorielle, qui est qui? + +```C +int factorial(int n) { + if (n > 1) { + return n * factorial(n - 1); + } else { + return 1; + } +} +``` + +# La récursivité (2/4) + +## Formellement + +* Une condition de récursivité - qui *réduit* les cas successifs vers... +* Une condition d'arrêt - qui retourne un résultat + +## Pour la factorielle, qui est qui? + +```C +int factorial(int n) { + if (n > 1) { // Condition de récursivité + return n * factorial(n - 1); + } else { // Condition d'arrêt + return 1; + } +} +``` + +# La récursivité (3/4) + +## Exercice: trouver l'$\varepsilon$-machine pour un `double` + +. . . + +```C +double epsilon_machine(double eps) { + if (1.0 + eps != 1.0) { + return epsilon_machine(eps / 2.0); + } else { + return eps; + } +} +``` + +# La récursivité (4/4) + +## Exercice: que fait ce code récursif? + +```C +void recurse(int n) { + printf("%d ", n % 2); + if (n / 2 != 0) { + recurse(n / 2); + } else { + printf("\n"); + } +} +recurse(13); +``` + +. . . + +```C +binaire(13): n = 13, n % 2 = 1, n / 2 = 6, + binaire(6): n = 6, n % 2 = 0, n / 2 = 3, + binaire(3): n = 3, n % 2 = 1, n / 2 = 1, + binaire(1): n = 1, n % 2 = 1, n / 2 = 0. + +// affiche: 1 1 0 1 +``` diff --git a/slides/figs/Float_example.svg b/slides/figs/Float_example.svg new file mode 100644 index 0000000000000000000000000000000000000000..5b34a69642355119257efec847796983663bd76f --- /dev/null +++ b/slides/figs/Float_example.svg @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="590" height="75"> + <style> + text { + font-size: 14px; + font-family: Arial, sans-serif; + text-anchor: middle; + } + </style> + <defs> + <g id="bit-0"> + <rect width="15" height="26" stroke="#000"/> + <text x="8" y="18.3" fill="#000">0</text> + </g> + <g id="bit-1"> + <rect width="15" height="26" stroke="#000"/> + <text x="8" y="18.3" fill="#000">1</text> + </g> + </defs> + + <g transform="translate(14.25,28.75)"> + <use xlink:href="#bit-0" fill="#c5fcff"/> + <g fill="#9fffad"> + <use xlink:href="#bit-0" x="15"/> + <use xlink:href="#bit-1" x="30"/> + <use xlink:href="#bit-1" x="45"/> + <use xlink:href="#bit-1" x="60"/> + <use xlink:href="#bit-1" x="75"/> + <use xlink:href="#bit-1" x="90"/> + <use xlink:href="#bit-0" x="105"/> + <use xlink:href="#bit-0" x="120"/> + </g> + <g fill="#ffaead"> + <use xlink:href="#bit-0" x="135"/> + <use xlink:href="#bit-1" x="150"/> + <use xlink:href="#bit-0" x="165"/> + <use xlink:href="#bit-0" x="180"/> + <use xlink:href="#bit-0" x="195"/> + <use xlink:href="#bit-0" x="210"/> + <use xlink:href="#bit-0" x="225"/> + <use xlink:href="#bit-0" x="240"/> + <use xlink:href="#bit-0" x="255"/> + <use xlink:href="#bit-0" x="270"/> + <use xlink:href="#bit-0" x="285"/> + <use xlink:href="#bit-0" x="300"/> + <use xlink:href="#bit-0" x="315"/> + <use xlink:href="#bit-0" x="330"/> + <use xlink:href="#bit-0" x="345"/> + <use xlink:href="#bit-0" x="360"/> + <use xlink:href="#bit-0" x="375"/> + <use xlink:href="#bit-0" x="390"/> + <use xlink:href="#bit-0" x="405"/> + <use xlink:href="#bit-0" x="420"/> + <use xlink:href="#bit-0" x="435"/> + <use xlink:href="#bit-0" x="450"/> + <use xlink:href="#bit-0" x="465"/> + </g> + <g fill="none" stroke="#000" stroke-width="2"> + <rect width="480" height="26"/> + <path d="m15,0 v26 M135,0 v26" fill="none" stroke="#000"/> + </g> + + <path d="m7.5,-3.5 v-9.5" stroke="#008080"/> + <path d="m16,-3.5 v-9.5 h118 v9.5" stroke="#008000" fill="none"/> + <path d="m136,-3.5 v-9.5 h343 v9.5" stroke="#800000" fill="none"/> + + <text y="-18"> + <tspan x="2">sign</tspan> + <tspan x="75">exponent (8 bits)</tspan> + <tspan x="307">fraction (23 bits)</tspan> + </text> + + <g transform="translate(0,30.5)" fill="#000"> + <circle r="2" cx="7.5"/> + <circle r="2" cx="22.5"/> + <circle r="2" cx="127.5"/> + <circle r="2" cx="142.5"/> + <circle r="2" cx="472.5"/> + </g> + + <text y="45.5"> + <tspan x="6">31</tspan> + <tspan x="27">30</tspan> + <tspan x="126">23</tspan> + <tspan x="146">22</tspan> + <tspan x="472.5">0</tspan> + </text> + <text x="243" y="44.5">(bit index)</text> + </g> + + <text x="504" y="48.4" style="text-anchor: start; font-size: 18.7px;">= 0.15625</text> +</svg> \ No newline at end of file diff --git a/slides/figs/Float_example_bare.svg b/slides/figs/Float_example_bare.svg new file mode 100644 index 0000000000000000000000000000000000000000..c74df6c445f026bc99fc8ee7d93ab6943415141f --- /dev/null +++ b/slides/figs/Float_example_bare.svg @@ -0,0 +1,430 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="491.4209" + height="75.638672" + version="1.1" + id="svg134" + sodipodi:docname="Float_example_bare.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + <metadata + id="metadata138"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1884" + inkscape:window-height="1052" + id="namedview136" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="1.2915254" + inkscape:cx="478.17825" + inkscape:cy="-102.24671" + inkscape:window-x="36" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg134" /> + <style + id="style2"> + text { + font-size: 14px; + font-family: Arial, sans-serif; + text-anchor: middle; + } + </style> + <defs + id="defs14"> + <g + id="bit-0"> + <rect + width="15" + height="26" + id="rect4" + x="0" + y="0" + style="stroke:#000000" /> + <text + x="8" + y="18.299999" + id="text6" + style="font-size:14px;font-family:Arial, sans-serif;text-anchor:middle;fill:#000000">0</text> + </g> + <g + id="bit-1"> + <rect + width="15" + height="26" + id="rect9" + x="0" + y="0" + style="stroke:#000000" /> + <text + x="8" + y="18.299999" + id="text11" + style="font-size:14px;font-family:Arial, sans-serif;text-anchor:middle;fill:#000000">1</text> + </g> + </defs> + <g + transform="translate(10.420898,28.192383)" + id="g130"> + <use + xlink:href="#bit-0" + id="use16" + style="fill:#c5fcff" + x="0" + y="0" + width="100%" + height="100%" /> + <g + id="g34" + style="fill:#9fffad"> + <use + xlink:href="#bit-0" + x="15" + id="use18" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-1" + x="30" + id="use20" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-1" + x="45" + id="use22" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-1" + x="60" + id="use24" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-1" + x="75" + id="use26" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-1" + x="90" + id="use28" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="105" + id="use30" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="120" + id="use32" + y="0" + width="100%" + height="100%" /> + </g> + <g + id="g82" + style="fill:#ffaead"> + <use + xlink:href="#bit-0" + x="135" + id="use36" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-1" + x="150" + id="use38" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="165" + id="use40" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="180" + id="use42" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="195" + id="use44" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="210" + id="use46" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="225" + id="use48" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="240" + id="use50" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="255" + id="use52" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="270" + id="use54" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="285" + id="use56" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="300" + id="use58" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="315" + id="use60" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="330" + id="use62" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="345" + id="use64" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="360" + id="use66" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="375" + id="use68" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="390" + id="use70" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="405" + id="use72" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="420" + id="use74" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="435" + id="use76" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="450" + id="use78" + y="0" + width="100%" + height="100%" /> + <use + xlink:href="#bit-0" + x="465" + id="use80" + y="0" + width="100%" + height="100%" /> + </g> + <g + id="g88" + style="fill:none;stroke:#000000;stroke-width:2"> + <rect + width="480" + height="26" + id="rect84" + x="0" + y="0" /> + <path + d="M 15,0 V 26 M 135,0 v 26" + id="path86" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + </g> + <path + d="M 7.5,-3.5 V -13" + id="path90" + inkscape:connector-curvature="0" + style="stroke:#008080" /> + <path + d="M 16,-3.5 V -13 h 118 v 9.5" + id="path92" + inkscape:connector-curvature="0" + style="fill:none;stroke:#008000" /> + <path + d="M 136,-3.5 V -13 h 343 v 9.5" + id="path94" + inkscape:connector-curvature="0" + style="fill:none;stroke:#800000" /> + <text + y="-18" + id="text102" + style="font-size:14px;font-family:Arial, sans-serif;text-anchor:middle"> + <tspan + x="2" + id="tspan96">sign</tspan> + <tspan + x="75" + id="tspan98">exponent (8 bits)</tspan> + <tspan + x="307" + id="tspan100">fraction (23 bits)</tspan> + </text> + <g + transform="translate(0,30.5)" + id="g114" + style="fill:#000000"> + <circle + r="2" + cx="7.5" + id="circle104" + cy="0" /> + <circle + r="2" + cx="22.5" + id="circle106" + cy="0" /> + <circle + r="2" + cx="127.5" + id="circle108" + cy="0" /> + <circle + r="2" + cx="142.5" + id="circle110" + cy="0" /> + <circle + r="2" + cx="472.5" + id="circle112" + cy="0" /> + </g> + <text + y="45.5" + id="text126" + style="font-size:14px;font-family:Arial, sans-serif;text-anchor:middle"> + <tspan + x="6" + id="tspan116">31</tspan> + <tspan + x="27" + id="tspan118">30</tspan> + <tspan + x="126" + id="tspan120">23</tspan> + <tspan + x="146" + id="tspan122">22</tspan> + <tspan + x="472.5" + id="tspan124">0</tspan> + </text> + <text + x="243" + y="44.5" + id="text128" + style="font-size:14px;font-family:Arial, sans-serif;text-anchor:middle">(bit index)</text> + </g> +</svg>