PCSI 1 - Stanislas DS d’INFORMATIQUE N◦2 - 26/03/16 - CORRIGÉ A. MARTIN
INFORMATIQUE
I. Représentation des entiers en base 2
I.1. Entiers naturels
1. n∈[0; 28−1 = 255] . Il y a donc256 valeurs distinctes.
2. def b a s e ( n ):
m = n L = []
w h i l e m != 0:
L = [ m \ % 2 ] + L m = m //2 r e t u r n L
I.2. Entiers relatifs
3. Définition :L’ensemble des entiers représentés est [−2N−1=−128; 2N−1−1 = 127] . a)sin≥0, alors on codenen base 2 surN= 8 bits. Le bit de poids fort estO.
b)sin <0, alors on code l’entier positifn+ 2N=n+ 256 surN= 8 bits. Le bit de poids fort est alors 1.
Il existe donc256 valeurs distinctes.
4. Sin <0, alors on code en base 2 le nombre
2N+n= 2N−1− |n|+ 1 = 111111112− |n|2
| {z }
Complément bit à bit de|n|
+1.
5. Méthode générale pour un nombre positif: on effectue des divisions par 2 successives jusqu’à ce que le quotient soit nul. Le nombre en binaire est alors constitué de la liste des restes dans l’ordre inverse. On complète éventuellement à gauche avec des zéros pour avoir 8 bits.
En pratique: sur 8 bits il est aisé de garder en tête la liste des puissances de 2 successives :
{20= 1,21= 2,22= 4,23= 8,24= 16,25= 32,26= 64,27= 128}
On a28 = 16 + 8 + 4, donc on obtient 2810= 00011100.
Un nombre entier négatif s’obtient en ajoutant 1 au complément bit à bit de sa valeur absolue : 65 = 64 + 1 donc 6510= 010000012 et −6510= 101111112.
6. Méthode: on effectue l’addition en binaire, puis on vérifie si le signe est correct sur le bit de poids fort.
Dans le cas contraire il y a un dépassement de capacité, le nombre attendu est en dehors de l’ensemble [−128; 127].
a)2810⊕6510= 000111002+ 010000012= 010111012= 9310 . L’opération est correcte.
b)2810⊕ −6510 = 000111002+ 101111112 = 110110112 = −001001012=−3710 . L’opération est correcte.
c)6510⊕10310= 010000012+ 011001112 = 101010002= −010110002=−8810. Le résultat devrait être négatif. Il y adépassement de capacité par valeur supérieurcar 168>127.
7. def c o m p l e m e n t _ 2 ( n ):
if n > 127 or n < -128: # e l i m i n e r l e s d e p a s s e m e n t s d e c a p a c i t e r e t u r n F a l s e
L = b a s e (abs( n ))
1
PCSI 1 - Stanislas DS d’INFORMATIQUE N◦2 - 26/03/16 - CORRIGÉ A. MARTIN
r e t u r n (8 -len( L ) ) * [ 0 ] + L # c o m p l e t e r a v e c d e s 0 s u r 8 b i t s if n >= 0:
r e t u r n L
e l s e: # n<0 : m o d i f i e r l a v a l e u r a b s o l u e i = 0
w h i l e L [ i ] == 0: # t r o u v e r l e 1 e r b i t n o n n u l a d r o i t e i = i + 1
for j in r a n g e( i , len( L )): # m o d i f i e r l e s b i t s a g a u c h e L [ j ] = 1 - L [ j ]
r e t u r n L
II. Représentation des flottants en base 2
8. E∈[−(25−1−1) =−15 ; 25−1= 16] .
En réalité les extrêmes−15 et 16 sont exploitées pour lesexceptions: ±∞, NaN, etc.
9. La précision relative correspond à la variation liée au dernier digit par rapport à la mantisse maximale 1,1111111111≈2, donc 2−10
2 = 2−11= 1
2048≈5×10−4.
10.Méthode: on commence par mettre le nombre décimal sous forme binaire en notation scientifique, puis on applique le codage.
Partie entière : 3210= 25= 1000002= 1,000002×25.
Partie fractionnaire : Il y a déjà 5 chiffres après la virgule donc il n’en reste plus que 5 pour 0,75.
0,75∗25= 24 = 16 + 8 = 110002. On remarque qu’il n’y a pas besoin de tronquer la partie décimale binaire.
Par conséquent−32,7510= (−1)11,00000110002×25.
Codage dans la norme IEEE 754 : s = 0,M = 1,0000011000 et l’exposantE = 5 est codé pare = E+ 15 = 2010= 16 + 4 = 101002.
Finalement on concatène les 3 parties, ce qui donne −32,7510= 1 10100 00000110002. 11.On décompose en 1 + 5 + 10 bits que l’on identifie :
s= 1 ; e= 100012 ; M= 1,00111010002
On en déduite= 1710, puis le vrai exposantE=e−15 = 210.
Ainsi le nombre vautx= (−1)1×20+ 2−3+ 2−4+ 2−5+ 2−7×22= (−1)1×22+ 2−1+ 2−2+ 2−3+ 2−5, donc
x=−(4 + 0,5 + 0,25 + 0,125 + 0,03125) donc x=−4,90625.
12.La précision relative minimale est 5×10−4, donc en dessous de cet écart le petit nombre est considéré nul. Voici deux exemples dans lesquels il n’y a pas à considérer en plus d’erreur de troncation lors du changement de base car les développements sont finis :
1,0−1,0 + 0,0001 = 0,00016= 1,0 + 0,0001−1,0 = 0,0 1,5−1,0 + 0,0001 = 0,50016= 1,5 + 0,0001−1,0 = 0,5
2
PCSI 1 - Stanislas DS d’INFORMATIQUE N◦2 - 26/03/16 - CORRIGÉ A. MARTIN
III. Représentations graphiques avec Numpy et Matplotlib
13. f r o m n u m p y i m p o r t *
f r o m m a t p l o t l i b . p y p l o t i m p o r t *
def m a _ f l e u r _ 2 D ( n ):
t h e t a = l i n s p a c e (0 ,2* pi , 1 0 0 * n ) R = cos ( n * t h e t a )
p l o t ( R * cos ( t h e t a ) , R * sin ( t h e t a )) s h o w ()
clf () r e t u r n
14. f r o m n u m p y i m p o r t *
f r o m m a t p l o t l i b . p y p l o t i m p o r t *
f r o m m p l _ t o o l k i t s . m p l o t 3 d i m p o r t A x e s 3 D
def m a _ f l e u r _ 3 D ( n , m ):
t h e t a = l i n s p a c e (0 , pi , 1 0 0 * n ) phi = l i n s p a c e ( - pi , pi , 2 0 0 * m ) [ THETA , PHI ] = m e s h g r i d ( theta , phi ) R = cos ( n * T H E T A )* sin ( m * PHI )
X , Y , Z = R * sin ( T H E T A )* cos ( PHI ) , R * sin ( T H E T A )* sin ( PHI ) , R * cos ( T H E T A ) gca ( p r o j e c t i o n =’ 3 d ’). p l o t _ s u r f a c e ( X , Y , Z , c m a p = cm . c o o l w a r m )
s h o w () clf () r e t u r n
3