diff --git a/README.md b/README.md index cc55319..03366f8 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,11 @@ Sur ce dépôt, vous trouverez les notes de cours ainsi que les sujets des TD/TP Le programme prévisionnel est le suivant : * CM : - [CM1](cm1-caracteres.md) : Codage des caractères - - [CM2](cm2-nombres.md) : Codage des entiers et réels - - [CM3](cm3-archi.md) : Architecture d'un ordinateur - - CM4 : Calcul booléen - - CM5 : Histoire de l'informatique et des ordinateurs - - CM6 : Histoire du libre, de l'open-source et du captif + - [CM2](cm2-entiers.md) : Codage des entiers + - [CM3](cm3-reels.md) : Codage des réels + - [CM4](cm4-archi.md) : Architecture d'un ordinateur + - CM5 : Calcul booléen + - CM6 : Histoire * TD : - [TD1](td1-caracteres.md) : Codage des caractères - [TD2](td2-entiers.md) : Codage des entiers diff --git a/cm2-nombres.md b/cm2-entiers.md similarity index 50% rename from cm2-nombres.md rename to cm2-entiers.md index 2302461..2d0dd42 100644 --- a/cm2-nombres.md +++ b/cm2-entiers.md @@ -1,4 +1,4 @@ -CM2 Codage des nombres - Notes de cours +CM2 Codage des entiers - Notes de cours ======================================= Quizz : Combien vaut 0.1 + 0.2 ? @@ -91,55 +91,3 @@ Représentation des entiers relatifs - Débordement ([char2.c](cm2-nombres-code/char2.c)) : - 127 + 1 = 128 - 0111 1111 + 0000 0001 = 1000 0000 -> -128 - - -Les réels -========= - -Ici, 0.1 + 0.2 = 0.30000000000004 ([détails ici](https://0.30000000000000004.com/)) ([double.c](cm2-nombres-code/double.c)) - - -Virgule fixe ------------- - -- Un réel = une partie entière et une partie fractionnaire séparés par une ',' -- On code par exemple sur 2 octets : - - 1 octet pour la partie réelle en complément à 2 (entier relatif) - - 1 octet pour la partie fractionnaire en inverse : 1/2, 1/4, 1/8, 1/16, etc. (était en décimal 1/10, 1/100, 1/1000, etc.) - - Il n'y a pas 1/10 ! -> On ne peut que s'approcher de 0.1, 0.2 et 0.3... -- Comme on écrit des nombres en décimal et qu'on les approxime avec des 1/2, 1/4, 1/8, etc. : - - 0.1 n'est pas exactement 0.1 - - 0.2 n'est pas exactement 0.2 - - donc 0.1 + 0.2 n'est pas exactement 0.3 - - Note : un nombre en binaire sera aussi approximé pour repasser en base 10... -- L'approximation n'est pas forcément visible car nous utilisons une précision assez grande mais elle est là -- => Pas de calcul décimal exact en réels, **pas de tests d'égalités** !!! - - égalités entre entiers seulement - - au pire test d'écart à la valeur recherchée (mais c'est critiqué, les incertitudes ne se propagent pas d'une bonne manière) -- Utilisé en pratique si pas mieux dispo (micro-contrôleur sans unité à virgule flottante par exemple) - - -Virgule flottante ------------------ - -- Signe (1 bit), exposant, mantisse -- Nombre = signe * mantisse * 2exposant -- En C, float (32 bits, peu précis à l'usage) et double (64 bits, plus précis) -- Exemple du double : 1 bit de signe, 11 bits d'exposant, 52 bits de mantisse (norme IEE754) -- Les mêmes approximations que précédemment ! (et donc pas non plus de tests d'égalité !!!) -- Couramment utilisé -- ([floatdouble.c](cm2-nombres-code/floatdouble.c)) - - -Calcul exact (bonus, hors programme) ------------------------------------- - -Pour aller au-delà de ces limites, il faudra utiliser des biblothèques/logiciels dédiés au calcul, par exemple [SageMath](https://www.sagemath.org/), [Calcium](https://fredrikj.net/calcium/), du décimal codé binaire (DCB) ou encore les [fractions python](https://docs.python.org/3/library/fractions.html) (mais c'est une autre histoire...). Ici, on pourra avoir 0.1 + 0.2 = 3. Les nombres ne sont alors plus représentés comme les types de base vus précédemment qui sont les seuls sur lesquels savent calculer les CPU classiques, mais comme des types construits à plus haut niveau. Points d'attention : -- les calculs sont plus lents, car un calcul de ce type construit impliquera plusieurs calculs sur des types de base au niveau CPU -- les types que vous manipulerez par défaut dans les langages de programmation les plus courants sont uniquement les types de base, efficaces mais donc inexacts. - - -Annexes -======= - -- [Entiers, virgules flottantes ou représentations exotiques ... (Olivier Poncet et Fabien Trégan, DevoxxFR 2022)](https://www.youtube.com/watch?v=1upzDFFIODk). Vidéo de 45 minutes, dont 15 premières minutes sur le programme de cette séance. diff --git a/cm3-reels.md b/cm3-reels.md new file mode 100644 index 0000000..79b8d1c --- /dev/null +++ b/cm3-reels.md @@ -0,0 +1,51 @@ +CM3 Codage des réels - Notes de cours +====================================== + + +Ici, 0.1 + 0.2 = 0.30000000000004 ([détails ici](https://0.30000000000000004.com/)) ([double.c](cm2-nombres-code/double.c)) + + +Virgule fixe +------------ + +- Un réel = une partie entière et une partie fractionnaire séparés par une ',' +- On code par exemple sur 2 octets : + - 1 octet pour la partie réelle en complément à 2 (entier relatif) + - 1 octet pour la partie fractionnaire en inverse : 1/2, 1/4, 1/8, 1/16, etc. (était en décimal 1/10, 1/100, 1/1000, etc.) + - Il n'y a pas 1/10 ! -> On ne peut que s'approcher de 0.1, 0.2 et 0.3... +- Comme on écrit des nombres en décimal et qu'on les approxime avec des 1/2, 1/4, 1/8, etc. : + - 0.1 n'est pas exactement 0.1 + - 0.2 n'est pas exactement 0.2 + - donc 0.1 + 0.2 n'est pas exactement 0.3 + - Note : un nombre en binaire sera aussi approximé pour repasser en base 10... +- L'approximation n'est pas forcément visible car nous utilisons une précision assez grande mais elle est là +- => Pas de calcul décimal exact en réels, **pas de tests d'égalités** !!! + - égalités entre entiers seulement + - au pire test d'écart à la valeur recherchée (mais c'est critiqué, les incertitudes ne se propagent pas d'une bonne manière) +- Utilisé en pratique si pas mieux dispo (micro-contrôleur sans unité à virgule flottante par exemple) + + +Virgule flottante +----------------- + +- Signe (1 bit), exposant, mantisse +- Nombre = signe * mantisse * 2exposant +- En C, float (32 bits, peu précis à l'usage) et double (64 bits, plus précis) +- Exemple du double : 1 bit de signe, 11 bits d'exposant, 52 bits de mantisse (norme IEE754) +- Les mêmes approximations que précédemment ! (et donc pas non plus de tests d'égalité !!!) +- Couramment utilisé +- ([floatdouble.c](cm2-nombres-code/floatdouble.c)) + + +Calcul exact (bonus, hors programme) +------------------------------------ + +Pour aller au-delà de ces limites, il faudra utiliser des biblothèques/logiciels dédiés au calcul, par exemple [SageMath](https://www.sagemath.org/), [Calcium](https://fredrikj.net/calcium/), du décimal codé binaire (DCB) ou encore les [fractions python](https://docs.python.org/3/library/fractions.html) (mais c'est une autre histoire...). Ici, on pourra avoir 0.1 + 0.2 = 3. Les nombres ne sont alors plus représentés comme les types de base vus précédemment qui sont les seuls sur lesquels savent calculer les CPU classiques, mais comme des types construits à plus haut niveau. Points d'attention : +- les calculs sont plus lents, car un calcul de ce type construit impliquera plusieurs calculs sur des types de base au niveau CPU +- les types que vous manipulerez par défaut dans les langages de programmation les plus courants sont uniquement les types de base, efficaces mais donc inexacts. + + +Annexes +======= + +- [Entiers, virgules flottantes ou représentations exotiques ... (Olivier Poncet et Fabien Trégan, DevoxxFR 2022)](https://www.youtube.com/watch?v=1upzDFFIODk). Vidéo de 45 minutes, dont 15 premières minutes sur le programme de cette séance. diff --git a/cm3-archi.md b/cm4-archi.md similarity index 99% rename from cm3-archi.md rename to cm4-archi.md index 71f4dea..bb1861d 100644 --- a/cm3-archi.md +++ b/cm4-archi.md @@ -1,4 +1,4 @@ -CM3 Architecture - Notes de cours +CM4 Architecture - Notes de cours ================================= J'ai quoi dans un ordinateur ?