Outils d'utilisateurs

Outils du Site


virgule_fixe

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

virgule_fixe [2015/07/19 20:53]
winjerome [Limitation des nombres réels]
virgule_fixe [2016/07/05 18:53] (Version actuelle)
gbdivers
Ligne 1: Ligne 1:
  
-^ [[boole_et_morgan|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[complex|Chapitre suivant]] ^+^ [[complex|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[ratio|Chapitre suivant]] ^
  
-====== Les nombres à virgule fixe ======+====== [Aller plus loin] Les nombres à virgule fixe ======
  
 ===== Limitation des nombres réels ===== ===== Limitation des nombres réels =====
Ligne 98: Ligne 98:
 </code> </code>
  
-En C++, il est possible de créer un nouveau type de nombre, qui permet de représenter plus facilement des nombres  à virgule fixe, mais vous verrez cela dans la partie sur la programmation objet. Dans ce chapitre, nous allons simplement utiliser un facteur directement dans le code. Ce n'est pas l’idéal en termes de conception, mais c'est suffisant pour le momentpour étudier le fonctionnement de cette représentation.+En C++, il est possible de créer un nouveau type de nombre, qui permet de représenter plus facilement des nombres  à virgule fixe, mais vous verrez cela dans la partie sur la programmation objet. Dans ce chapitre, nous allons simplement utiliser un facteur directement dans le code. Ce n'est pas l’idéal en termes de conception, mais c'est suffisant pour le moment pour étudier le fonctionnement de cette représentation.
  
-Définir une représentation n'est pas suffisante, il faut également définir les opérations arithmétiques de base. Pour l'addition et la soustraction, l'utilisation des opérateurs par défaut des entiers fonctionnent sans problème.+Définir une représentation n'est pas suffisante, il faut également définir les opérations arithmétiques de base. Pour l'addition et la soustraction, les opérateurs par défaut des entiers fonctionnent sans problème.
  
 <code> <code>
Ligne 131: Ligne 131:
 ===== Facteurs non multiples de dix ===== ===== Facteurs non multiples de dix =====
  
-Supposons que vous souhaitez compter de 0 à 10 avec un pas de un tiers (cela signifie que vous incrémenter votre compteur de 1/3 chaque fois). Pour cela, vous allez écrire un code similaire au code suivant (en pseudo-code, pas en C++) :+Supposons que vous souhaitez compter de 0 à 10 avec un pas de un tiers (cela signifie que vous incrémentez votre compteur de 1/3 à chaque fois). Pour cela, vous allez écrire un code similaire au code suivant (en pseudo-code, pas en C++) :
  
 <code> <code>
Ligne 140: Ligne 140:
 Remarque : un identifiant comme ''compteur'', qui permet de se souvenir d'une valeur, est appelée une variable. Vous verrez cela dans les prochains cours. Remarque : un identifiant comme ''compteur'', qui permet de se souvenir d'une valeur, est appelée une variable. Vous verrez cela dans les prochains cours.
  
-Si vous répétez ce calcul, la différence entre la valeur calculée et la valeur correcte attendu va progressivement augmenter. Le graphique suivant représente l'erreur de calcul en fonction de la valeur du compteur :+Si vous répétez ce calcul, la différence entre la valeur calculée et la valeur correcte attendue va progressivement augmenter. Le graphique suivant représente l'erreur de calcul en fonction de la valeur du compteur :
  
 {{ :errors.png |}} {{ :errors.png |}}
  
-Note : pour mieux voir le phénomène, j'ai volontairement utilisée des nombres réels sur 32 bits (simple précision). Il existe des types de nombres réels plus précis, mais ce n'est pas important ici. Le problème existe avec tous les types de nombres réels, la seule différence est qu'il met plus de temps apparaître.+Note : pour mieux voir le phénomène, j'ai volontairement utilisé des nombres réels sur 32 bits (simple précision). Il existe des types de nombres réels plus précis, mais ce n'est pas important ici. Le problème existe avec tous les types de nombres réels, la seule différence est qu'il met plus de temps à apparaître.
  
 Vous voyez que l'erreur devient assez vite importante. Selon vos besoins, vous pouvez accepter les valeurs en dessous de 1000, mais l'erreur devient trop importante au-delà. Vous voyez que l'erreur devient assez vite importante. Selon vos besoins, vous pouvez accepter les valeurs en dessous de 1000, mais l'erreur devient trop importante au-delà.
  
-La solution est assez simple (vous l'aurez devinez, vu que l'on est dans le chapitre sur les nombres à virgule fixe) : il suffit d'utiliser un compteur entier, qui sera incrémenter de 1 chaque fois. La valeur du compteur réel sera obtenu en divisant par 3.+La solution est assez simple (vous l'aurez deviné, vu que l'on est dans le chapitre sur les nombres à virgule fixe) : il suffit d'utiliser un compteur entier, qui sera incrémenté de 1 à chaque fois. La valeur du compteur réel sera obtenue en divisant par 3.
  
 <code> <code>
Ligne 155: Ligne 155:
 </code> </code>
  
-Avec un compteur réel, si on compte jusque 10000, il y aura donc 30000 additions réelles, chaque addition ajoutant une erreur (presque infime) de calcul. Ces erreurs vont s'accumuler, jusqu'au point de ne plus être négligeable.+Avec un compteur réel, si on compte jusqu'à 10 000, il y aura 30 000 additions réelles, chaque addition ajoutant une erreur (presque infime) de calcul. Ces erreurs vont s'accumuler, jusqu'au point de ne plus être négligeables.
  
-Avec le compteur entier, comme chaque addition est exacte, les 30000 additions ne produisent pas d'erreur de calcul. La seule opération réalisée sur des nombres réels (donc avec une erreur de précision) est la division par 3. L'erreur de calcul finale est donc l'erreur sur une seule opération réelle, ce qui reste négligeable.+Avec le compteur entier, comme chaque addition est exacte, les 30 000 additions ne produisent pas d'erreur de calcul. La seule opération réalisée sur des nombres réels (donc avec une erreur de précision) est la division par 3. L'erreur de calcul finale est donc l'erreur sur une seule opération réelle, ce qui reste négligeable.
  
-<note>Le code pour réaliser ce test est relativement simple. Cependant, vous imaginez bien qu'il n'est pas possible de faire cela en écrivant 30000 fois la ligne de code C++ pour faire l'addition. Pour cela, on va utiliser une bouclequi sera vu par la suite. L’écriture de ce code sera proposée comme exercice.</note>+<note>Le code pour réaliser ce test est relativement simple. Cependant, vous imaginez bien qu'il n'est pas possible de faire cela en écrivant 30 000 fois la ligne de code C++ pour faire l'addition. Pour cela, on va utiliser une boucle qui sera vue par la suite. L’écriture de ce code sera proposée comme exercice.</note>
  
 ===== Lecture complémentaire ===== ===== Lecture complémentaire =====
  
-Voir l'article sur Wikipedia : [[https://en.wikipedia.org/wiki/Fixed-point_arithmeti|Fixed-point arithmetic]].+Voir l'article sur Wikipedia : [[https://en.wikipedia.org/wiki/Fixed-point_arithmetic|Fixed-point arithmetic]].
  
-^ [[boole_et_morgan|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[complex|Chapitre suivant]] ^+^ [[complex|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[ratio|Chapitre suivant]] ^
  
 {{tag> Cours C++}} {{tag> Cours C++}}
virgule_fixe.1437331987.txt.gz · Dernière modification: 2015/07/19 20:53 par winjerome