http://tsi.ljf.free.fr/ATS/
Représentation des données TP
v3.2
Lycée Jules Ferry - 82 Bd de la République - 06400 CANNES
http://tsi.ljf.free.fr/ATS/
Table des matières
1 Conversion 3
1.1 Programme de conversion décimal vers binaire et hexadécimal . . . 3
1.2 Exploitation de l'information d'un codeur absolu . . . 3
2 Précision de la représentation des nombres 4 2.1 Représentation des entiers . . . 4
2.2 Représentation des réels : mantisse et exposant . . . 5
3 Erreurs de représentation 6 3.1 Première analyse . . . 6
3.2 Seconde analyse : erreur d'absorption . . . 7
3.3 Troisième analyse . . . 9
3.4 Quatrième analyse : erreur d'annulation . . . 10
http://tsi.ljf.free.fr/ATS/
1 Conversion
1.1 Programme de conversion décimal vers binaire et hexadécimal Question 1
Ecrire un programme qui demande à l'utilisateur un nombre entier, et qui ache sa conversion en binaire et en hexadécimal.
Le programme doit acher les phrases :
• "La conversion de (valeur) en binaire est : (conversion)"
• "La conversion de (valeur) en hexadécimal est : (conversion)"
Outre les fonctions de saisie et d'achage que vous connaissez (input()etdisp()), vous utiliserez les fonctions de conversion dec2bin(valeur) etdec2he(valeur).
1.2 Exploitation de l'information d'un codeur absolu
Figure 1 Codeur absolu
Un codeur absolu est un capteur angulaire qui délivre une infor- mation binaire proportionnelle à l'angle du capteur.
La précision de ce codeur dépend du nombre de pistes, traduisant le nombre de bits codant l'angle, cet angle allant de 0° à 360°.
On s'intéresse ici à un codeur à 12 pistes, qui fournira donc une information angulaire theta sous la forme d'un nombre binaire à 12 bits.
Question 2
Quelle est la précision de ce codeur ?
Les 360° du codeur sont codés sur 12 bits. 12 bits codent 212−1 positions. La précision est donc égale à 360
212−1= 0.0879◦.
http://tsi.ljf.free.fr/ATS/
Ecrire un programme dans lequel l'utilisateur rentrera la valeur binaire (variable theta) fournie par le capteur, et qui lui fournira la valeur angulaire correspondante.
2 Précision de la représentation des nombres
2.1 Représentation des entiers On considère le nombre entier N=1534.
Question 4
Comment s'écrit ce nombre en binaire ?
>dec2bin(1534) ans = 10111111110
Question 5
Combien de bits sont nécessaires pour la représentation de ce nombre ? 11 bits
La fonction int16() permet de convertir un nombre en entier codé sur 16 bits.
Question 6
Quel est le résultat de la conversion en entier sur 16 bits du nombre 1534 ?
>int16(1534) ans = 1534
http://tsi.ljf.free.fr/ATS/
La fonction int8()permet de convertir un nombre en entier codé sur 16 bits.
Question 7
Quel est le résultat de la conversion en entier sur 8 bits du nombre 1534 ?
>int8(1534) ans = -2
La fonction int8() ne conserve que les 8 premiers bits de la conversion, et le convertir en entier signé.
Question 8
Quel est le nombre b0inaire à 8 bits correspondant à la conversion du réel 1534 ? 11111110
On remarque que les 3 bits de poids fort ont été tronqués : (101) 11111110
On rappelle que int8()eectue une conversion en entier signé.
Question 9
Quel est le signe de ce nombre ? En déduire la valeur correspondante en base 10.
Le bit de poids le plus fort est égal à 1 : signe négatif Le complément +1 vaut000000012 + 1
=000000102 =210
>int8(1534) ans = -2
2.2 Représentation des réels : mantisse et exposant
Scilab représente les réels en virgule ottante avec un signe, une matisse et un exposant.
La fonction frexp ([réel]) fournit les valeurs de la mantisse et de l'exposant du réel.
Par exemple :
Lignes de commande
>[f,e]=frexp([10.32]) e = 4.
f = 0.645
Ainsi, Scilab code le réel 10,32 par f∗2e= 0.645.24.
http://tsi.ljf.free.fr/ATS/
Quelle est la représentation (mantissem1et exposante1) du réel 3.583 ? (on utilisera la fonction format('v',15)pour forcer l'achage des décimales et éviter les arrondis).
> format('v',15)
>[m1,e1]=frexp(3.583) e1 = 2.
m1 = 0.89575
Question 11
Retrouver le résultat en eectuant l'opérationm1.2e1. Que remarquez-vous ?
> m1*2^e1 ans = 3.583
3 Erreurs de représentation
3.1 Première analyse Mathématiquement, √
6 =√ 2.√
3. Nous allons chercher à voir comment Scilab eectue ces opéra- tions et les précisions associées.
Question 12
Calculer a=sqrt(6), b=sqrt(2) et c=sqrt(3).
Calculer a-b*c. Commenter ce résultat.
> a=sqrt(6) ;b=sqrt(2) ;c=sqrt(3) ;
> a-b*c
ans = -4.44089210D-16
L'erreur provient probablement du codage en double précision.
http://tsi.ljf.free.fr/ATS/
Recongurer le format d'achage par défaut des nombres décimaux : format('v',10).
Question 13
Déterminer la mantissem6et l'exposant e6du codage de√ 6.
Déterminer la mantissem2et l'exposant e2du codage de√ 2. Déterminer la mantissem3et l'exposant e3du codage de√
3.
Nombre Mantisse Exposant
√6 0.6123724 2
√2 0.7071068 1
√
3 0.8660254 1
Question 14
Calculer alorsm6∗2e6−(m3∗2e3)∗(m2∗2e2). Conclure.
>m6*2^e6-(m3*2^e3)*(m2*2^e2) ans = - 4.441D-16
Le problème provient donc bien du codage en double précision.
3.2 Seconde analyse : erreur d'absorption 3.2.1 Premier exemple
On pose X = 1.1030 etY = 1.1010.
Sous Scilab, dénir ces constantes puis eectuer les opérations suivantes :
• S1=X+Y-X
• S2=X-X+Y
Lignes de commande
>X=1D30 ;Y=1D10 ;
>S1=X+Y-X
>S2=X-X+Y
http://tsi.ljf.free.fr/ATS/
Qu'attendiez-vous comme résultat ? Qu'observez-vous ?
On attend dans les deux cas la valeur de Y comme résultat
>S1=X+Y-X >S2=X-X+Y
S1 = 0 S2 = 1.000D+10
Il s'agit là d'une erreur d'absorption de Y par X dans le premier calcul.
Question 16
Déterminez la mantisse et l'exposant de X, de Y et de X+Y Conclure sur le résultat de X+Y-X fourni par Scilab.
> [m,e]=frexp(X) e = 100.
m = 0.7888609
> [m,e]=frexp(Y) e = 34.
m = 0.5820766
> [m,e]=frexp(X+Y) e = 100.
m = 0.7888609 Lorsque X
Y <2−53alors1 +X Y = 1
http://tsi.ljf.free.fr/ATS/
3.2.2 Associativité
L'associativité des opérations élémentaires comme par exemple l'additivité : (x+y) +z=x+ (y+z)
n'est plus valide en mathématiques nies.
Question 17
On considère les trois nombres ci-dessous, avec 6 chires signicatifs : X=1.23456e-23 , Y=1.000000e13 , Z=-Y
Calculer X+(Y+Z), puis (X+Y)+Z. Que constatez-vous ? Quelle conclusion tirez-vous ?
>X+(Y+Z) ans =
1.235D-23 (X+Y)+Z ans = 0.
Il y a absorption de X par Y dans le deuxième calcul. Il est donc très important de faire at- tention à l'ordre des opérations.
3.3 Troisième analyse
Mathématiquement, on vérie bien évidemment (√
2)2−2 = 0. Exécuter les opérations suivantes sous Scilab :
Lignes de commande
>sqrt(2)
>ans^2
>ans-2
http://tsi.ljf.free.fr/ATS/
Qu'observez-vous ?
>sqrt(2) ans = 1.4142136
>ans^2 ans = 2.
>ans-2
ans = 4.441D-16
L'erreur de précision de la racine se répercute dans l'élévation au carré :(√
2)2−26= 0 Notons qu'il s'agit de la même erreur qu'à la question 12 :4.41.10−16= 2.%eps.
3.4 Quatrième analyse : erreur d'annulation 3.4.1 Mise en évidence
On considère la fonction y= 1 1−√
1−x2.
Dénir la fonction y =f(x) dans Scilab comme suit : Lignes de commande
>functiony=f(x)
> y=1/(1-sqrt(1-x^2))
> endfunction
Question 19
Pour quelle valeur de x le dénominateur de f(x) s'annule-t'il ? Calculer avec Scilab les valeurs de f(1),f(1.10−5) etf(1.10−8).
Calculer ensuite la valeur def(1.10−9). Pourquoi obtient-on ce résultat ? f(x) s'annule pour x=0, donc pour√
1−x2 = 1.
Scilab fournitf(1) = 1,f(1e−5) = 2.000D+ 10,f(1e−8) = 9.007D+ 15.
Si x2 < %eps, donc si |x| < p
%eps, alors le calcul numérique de √
1−x2 fournira la valeur 1.
Ainsi, pour toute valeur x <
p%eps
2 Scilab va considérer le résultat√
1−x2= 1
http://tsi.ljf.free.fr/ATS/
3.4.2 Correction de l'erreur
Il faut donc dénir une fonction équivalente àf(x)qui ne fasse plus intervenir le terme 1 1−√
1−x2 Question 20
Multiplier le numérateur et le dénominateur def(x) par1 +√
1 +x2, et en déduire une nouvelle expression def(x).
Programmer une nouvelle fonction f2 avec cette expression, et vérier le résultat de f2(1.10−9) et def2
1 2%eps
. f(x) = 1
1−√ 1−x2
1 +√ 1 +x2 1 +√
1 +x2 = 1 +√ 1 +x2
1−(1−x2) = 1 +√ 1 +x2 x2
> function y=f2(x)
> y=(1+sqrt(1-x^2))/x^2
> endfunction
f2(1e−9) = 2.000D+ 18 f2(0.5∗%eps) = 1.623D+ 32
3.4.3 Exemple de correction de l'erreur d'annulation
On cherche à estimer le nombreπ par l'algorithme de calcul par les polygônes inscrits. On considère un cercle de rayon r = 1, et on note An l'aire associée au polygône inscrit àn côté.
En notantαn= 2π
n ,An est égale à n fois l'aire du triangle ABC :
An = ncosαn 2 sinαn
2 = n
2(2 cosαn 2 sinαn
2 )
= n
2sinαn= n 2 sin2π
n
http://tsi.ljf.free.fr/ATS/
Par ailleurs sinαn
2 =
r1−cosαn
2 =
s 1−p
1−sin2αn
2 .
Ainsi, en prenant n= 2k, on dénit une équation de récurrence qui permet de calculerπ : xk=A2k= 2k
2 sk avecsk= sin2π 2k =
r1−√
1−sk−1
2 , etπ = lim
k→+∞A2k
Question 21
Programmer et exécuter l'algorithme ci-dessous :
s←1;n←4 (Initialisations)
Tantque s >1e−10 faire
s←sqrt((1−sqrt(1−s∗s))/2) (nouvelle valeur de sin(α/2)
n←2∗n (nouvelle valeur de n)
A←(n/2)∗s (nouvelle valeur de l'aire du polygone) Fin Tantque
Qu'observez-vous ? Comment peut-on expliquer ce résultat ?
L'algorithme converge initialement versπ, puis nalement délivre la valeur 0 ! !
Commme αn →0, le numérateur est de la forme1−√
1−2 avec = sinαn petit : il y a eu d'erreur d'annulation.
Question 22
Pour remédier à ce problème, il faut reformuler les équations de façon à ne plus risquer les erreurs d'annulation.
Nous allons multiplier numérateur et dénominateur par(1 +p
1−sin2αn) : sinαn
2 = s
1−p
1−sin2αn
2 =
s 1−(1−sin2αn)
2(1 +p
1−sin2αn) = sinαn q
2(1 +p
1−sin2αn)
Question 23
Réécrire le programme de récurrence en prenant en compte la correction. Exécuter ce programme et conclure.
L'algorithme converge cette fois vers12k→3.1415927, soitπ