Codage des nombres : Exercices
1 - Codage des Nombres Entiers
Q1. Donner l’intervalle de codage pour des nombres entiers non signés codés sur 8 bits
Q2. Donner l’intervalle de codage pour des nombres entiers signés codés sur 8 bits
Q3. Compléter le tableau suivant ( format des données : 8 bits ) :
2 - Codage des nombres réels en virgule fixe
On souhaite asservir une machine à courant continu. Ce moteur est alimenté au travers d’un hacheur en pont que l’on commandera par un signal à rapport cyclique variable. Puisqu’il s’agit de contrôler la vitesse, on couplera au moteur une génératrice tachymétrique fournissant une tension ‘continue’ image de la vitesse. La consigne de vitesse proviendra d’un automate maître via un bus de terrain.
D’un point de vue automatique, la modélisation est tout à fait classique :
Loi de Commande en automatique numérique :
Q1. Quel type de représentation en virgule fixe faut-il envisager pour coder les coefficients 0.95625, -1.29375 et 0.3375, sachant que l’on dispose d’un microcontrôleur 8 bits ?
Q2. Coder alors ces coefficients en base 2, puis en base 16
3 - Codage des nombres réels en virgule flottante
Q1. Soient les deux nombres signés X = + 75.5 et Y = -75.5. Déterminer leur codage IEEE P754 sur 32 bits (virgule flottante normalisée en simple précision).
4 - Opérations Binaires et bits d’état
Q1. Réaliser les opérations binaires suivantes, et pour chaque résultat indiquer la valeur des bits d’état NZVC.
- N : Résultat Négatif
- Z : Résultat égal à zéro
- C : retenue ( carry ), débordement non signé
- V : Débordement signé
5 - Capteur de température
Le capteur de température DS75 de Dallas Semiconductor fournit une information binaire sur 12 bits en
complément à 2 représentant la température en degrés Celsius.
La plage de températures valides du capteur est − 55° C ≤ T ° C ≤ 125° C.
Le capteur utilise un codage en virgule fixe avec un format [8,4].
Q1. Indiquer la précision de la représentation binaire des températures obtenues à partir du capteur.
On souhaite déterminer pour chaque valeur du tableau ci-dessus la température en degré Farenheit (°F). La relation liant les deux systèmes d’unité est:
Le code suivant (fichier ex_float.c) permet de réaliser et d’afficher les tableaux de températures dans les deux unités.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N_Q 4 /* 4 bits de partie fractionnaire */
int tc[9] = { /* A COMPLETER */ };
float tf[9];
float fixed_to_float(int a, int n_q)
{
return ((float)a/(float)(1<<n_q));
}
int main()
{
int i;
printf("Les temperatures sont :\n");
for (i=0;i<9;i++) {
tf[i] = 1.8*fixed_to_float(tc[i],N_Q)+32.0;
printf("%9.4f degres C ---> %9.4f degres F\n",fixed_to_float(tc[i],N_Q),tf[i]);
}
return 0;
}
Les températures de départ fournies par le capteur sont stockées dans le tableau int tc[]. Chaque valeur issue du capteur est stockée dans un entier signé 32 bit (type int du langage C), ce qui étend alors le format de [8,4] à [28,4].
Q2. Déterminer la représentation compactée en hexadécimal des données issues du capteur et ajouter les valeurs au tableau tc.
5.1 - Calcul en Virgule Flottante
Le calcul de la température en degré Farenheit est ici réalisé en utilisant le calcul en virgule flottante (tableau tf[] de type float). Il est nécessaire de convertir les valeurs de tc[] de virgule fixe à virgule flottante.
La fonction fixed_to_float() permet de convertir le nombre entier a contenant un nombre codé en virgule fixe avec q bits de partie fractionnaire vers un nombre en virgule flottante de type float (IEEE simple précision – 32 bits).
Q3. Compléter et tester le programme ex_float.
5.2 - Calcul en Virgule Fixe
Nombre de microprocesseurs utilisés dans les systèmes embarqués ne possèdent pas d’unité de calcul
en flottant (Floating Point Unit – FPU).
Les opérations de base sont alors émulées par logiciel, ce qui est coûteux en temps d’exécution du programme.
Il peut être alors judicieux de réaliser les calculs en virgule fixe, qui ne font appel qu’à des opérations sur les entiers (implémentées sur tous les microprocesseurs de
manière matérielle).
On introduit deux constantes k1 et k0 qui sont les représentations respectives de 1.8 et 32.0 en
virgule fixe.
Q4. Indiquer le codage k1 au format [28,4] de la constante 1.8.
Q5. Déterminer le format de la variable tmp.
Q6. En déduire le codage k0 de la constante 32.0.
Q7. Déterminer le format de codage du résultat.
Q8. Compléter le code du fichier ex_fixed1.c et comparer les résultats par rapport à l’exécution en virgule flottante
#include <stdio.h>
#include <stdlib.h>
#define N_Q 4 /* 4 bits de partie fractionnaire */
int tc[9] = { /* A COMPLETER */ };
int k1=0; /* A MODIFIER */
int k0=0; /* A MODIFIER */
int tf[9], tmp;
float fixed_to_float(int a, int n_q)
{
return ((float)a/(float)(1<<n_q));
}
int main()
{
int i;
printf("\nk1 = %#06x, k0=%#010x\n\n",k1,k0);
printf("Les temperatures sont :\n");
for (i=0;i<9;i++) {
tmp=k1*tc[i];
tf[i] = tmp+k0;
printf("%9.4f degres C ---> %9.4f degres F\n",fixed_to_float(tc[i],N_Q),fixed_to_float(tf[i],N_Q));
}
return 0;
}
Q9. Réaliser (dans ex_fixed2.c) l’adaptation de format nécessaire sur les constantes afin que, dans le pire des cas, l’erreur de représentation du résultat en °F soit inférieure à 0.1°F, puis pour qu’elle soit minimale.