Calcul et technologies
Fermer ×

Les principes mathématiques

Mathématique interne : le binaire

Histoire

On attribue le système binaire à Leibniz vers 1700, mais ceci cette version a été contestée par John W. Shirley dans "Binary Numeration before Leibniz".
il y a même une référence aux hexagrammes du Yi Jing (classique des changements) qui peuvent être représentés par un code binaire sur 6 bits (un bit est un chiffre qui vaut 0 ou 1).

Les bases de calcul

En base 10, on utilise les chiffres de 0 à 9 associés à un multiplicateur exprimé par une puissance de 10. En base 2 on utilise les chiffres 0 et 1 associés à un multiplicateur exprimé par une puissance de 2. On pourrait généraliser ce principe à n'importe quelle base de représentation des nombres. Pour des bases supérieures à 10, on utilise des symboles en plus des chiffres de 0 à 9 que l'on appelle digits. En informatique, on utilise également la base 16 qui utilise les digits de 0 à 9 et A à F (majuscule ou minuscule).

Représentation des entiers

On distingue les entiers non signés (ensemble ℕ) et les entiers signés (ensemble ℤ).

Les entiers non signés

En appliquant ce qui vient d'être expliqué précédemment, on peut écrire la relation qui permet d'exprimer un nombre en base 10 à partir d'un nombre exprimé en base 2 sur n bits : N 10 = k = 0 n - 1 a k 2 k .
Cette relation permet de convertir un nombre exprimé en base 2 en un nombre exprimé en base 10.

101011012=17310
On applique la définition à la suite binaire : 10101101
1 x 2 7 + 0 x 2 6 + 1 x 2 5 + 0 x 2 4 + 1 x 2 3 + 1 x 2 2 + 0 x 2 1 + 1 x 2 0
128 + 32 + 8 + 4 + 1 = 173

Prendre un papier et un crayon, puis demander

Solution [ Voir ]

La conversion décimale binaire est réalisée à l'aide d'une suite de divisions pas 2 jusqu'à ce que le quotient vaille 0.

173 2
13 86 2
1 06 43 2
0 03 21 2
1 01 10 2
1  0 5 2
1 2 2
0 1 2
1 0
Après avoir fait toutes les divisions en cascade, on relève tous les restes des divisions en partant par le reste de la dernière division effectuée et en terminant par le reste de la première division effectuée. Ces valeurs binaires correspondent à la valeur du nombre décimal en binaire.

L'exemple ci-contre donne la conversion de 173 en base 2

  1. on divise 173 par 2, le quotient est 86 et le reste est 1
  2. on divise 86 par 2, le quotient est 43 et le reste est 0
  3. on divise 43 par 2, le quotient est 21 et le reste est 1
  4. on divise 21 par 2, le quotient est 10 et le reste est 1
  5. on divise 10 par 2, le quotient est 5 et le reste est 0
  6. on divise 5 par 2, le quotient est 2 et le reste est 1
  7. on divise 2 par 2, le quotient est 1 et le reste est 0
  8. on divise 1 par 2, le quotient est 0 et le reste est 1

Le résultat est 17310=101011012

Prendre un papier et un crayon, puis demander

Solution [ Voir ]

A la place des divisions, je propose une méthode avec un tableau. On construit le tableau des puissances de 2 de 128, qui est la puissance de deux immédiatement inférieure à 173, jusqu'à 1

1286432168421
10101101
  1. On calcule 173-128=45 on ajoute 1 dans la colonne 128
  2. On calcule 45-64<0 on garde l'ancienne valeur 45 et on ajoute 0 dans la colonne 64
  3. On calcule 45-32=13 on ajoute 1 dans la colonne 32
  4. On calcule 13-16<0 on garde l'ancienne valeur 13 et on ajoute 0 dans la colonne 16
  5. On calcule 13-8=5 on ajoute 1 dans la colonne 8
  6. On calcule 5-4=1 on ajoute 1 dans la colonne 4
  7. On calcule 1-2<0 on garde l'ancienne valeur 1 et on ajoute 0 dans la colonne 2
  8. On calcule 1-1=0 on ajoute 1 dans la colonne 1

on déduit que 17310= 101011012

Prendre un papier et un crayon, puis demander

Solution [ Voir ]

Les entiers signés

Pour représenter les nombres négatifs dans une base, on utilise le complément à la base en utilisant la relation - b n 2 N b n 2 - 1 où N est le nombre signé et n le nombre de bits maximium utilisé pour la représentation. Cela signifie qu'un nombre signé ne peut être identifié comme signé que sur un nombre de bits connus. Cela ne pose pas de problème pour les calculatrices et ordinateurs car le nombre de bits est fixé par la structure matérielle de la machine et peut être 8,16,32 ou encore 64 bits (8 et 16 étant maintenant obsolètes).

Dans le cas de la base 2 cette relation donne - 2 n 2 N 2 n 2 - 1 - 2 n - 1 N 2 n - 1 - 1 . Ce qui fait que c'est le bit de poids le plus fort (rang n-1), pour un nombre exprimé sur n bits, qui représente le signe du nombre, ce qui fait que le nombre en base 10, peut s'écrire en utilisant la relation : N 10 = - a n - 1 2 n - 1 + k = 0 n - 2 a k 2 k .

101011012=-8310
On applique la définition à la suite binaire : 10101101
-1 x 2 7 + 0 x 2 6 + 1 x 2 5 + 0 x 2 4 + 1 x 2 3 + 1 x 2 2 + 0 x 2 1 + 1 x 2 0
- 128 + 32 + 8 + 4 + 1 = -83

Une remarque importante :
la valeur négative -83 donne la même suite binaire que 173 sur 8 bits. On en déduit que la valeur binaire ne permet pas de savoir si le nombre est négatif ou positif. Ceci explique que certains langage de programmation distinguent les entiers signés des entiers son signés et d'autres utilisent uniquement des entiers signés. Au niveau du processeur c'est un registre particulier, nommé registre d'état qui contient les informations de signe après chaque calcul.
Sur les calculatrices les fonctions de conversions qui traitent les nombres négatifs utilise un certain nombre de bits (en général 16) qu'il faut respecter pour obtenir le bon résultat.

Addition en binaire

L'addition en binaire donne un résultat binaire identique pour les nombres signés et non signés. Cela vient de la représentation des entiers signés en complément à 2 et confirme que la représentation binaire ne permet de définir le type d'entier signé ou non signé.

1 1  valeur non signée valeur signée
0100100173 73
+10101101173 -83
11110110246 -10

Le résultat ne peut pas être exprimé sur 9 bits, la retenue n'est pas affichée, car les microprocesseurs expriment le résultat sur le même nombre de bits que les opérandes :

11111  valeur non signée valeur signée
11110111247 -9
+0101110092 92
01010011339 83
calcul non signé : on trouve une retenue finale (le résultat ne peut pas être exprimé sur 8 bits non signé)

L'addition de deux nombres non signés de n bits donne normalement un nombre sur n bits. Le résultat est exprimé sur sur n bits, il y a donc des cas ou le résultat sera erroné.
L'addition de deux nombres signés de n bits peut également fournir des résultats erronés, comme la somme de deux nombres positifs qui donnent un nombre négatif ou bien la somme de deux nombres négatifs qui donnent un résultat positif, dans ce cas on parle de dépassement dans les calculs.

1111  valeur non signée valeur signée
01101010106 106
+0011110161 61
10100111167 -89
calcul signé, il y a dépassement : l'addition de deux nombres positifs ne peut pas donner un résultat négatif

En base 10 faire une soustraction revient à ajouter l'opposé du nombre. En base 2, faire une soustraction revient également à ajouter la valeur négative du nombre qui est le complément à 2 du nombre.

Le calcul du complément à 2
Pour transformer un nombre positif en un nombre négatif en base 10, on ajoute le signe moins devant le nombre. En base 2 on calcule le complément à 2 qui consiste à prendre le complément à 1 du nombre puis ajouter 1. Le complément à 1 consiste à changer la valeur de chaque bit : un 0 devient un 1 et un 1 devient un 0.
L'exemple ci-dessous montre comment calculer le complément à 2 de la valeur 83 en base 10, et vérifie que le résultat donne bien -83.

01010011=83
10101100
+00000001
10101101=-83

Prendre un papier et un crayon, puis demander

Solution [ Voir ]

Représentation des réels

Réels en virgule fixe

Un nombre en virgule fixe possède une partie entière et une partie fractionnaire (les chiffres après la virgule). Chaque partie est exprimée sur un nombre maximum de bits.
On procède de manière identique à la méthode des nombres non signés pour la partie entière, exprimée sur n bits, et, en ajoutant des puissances négatives de 2 pour la partie fractionnaire exprimée sur p bits : N 10 = k = - p n - 1 a k 2 k .
La conversion de la forme binaire vers la forme décimale se fait également en appliquant la définition :

110001.0011112=49.23437510
On applique la définition à la suite binaire : 110001.001111
1 x 2 5 + 1 x 2 4 + 0 x 2 3 + 0 x 2 2 + 0 x 2 1 + 1 x 2 0 + 0 x 2 -1 + 0 x 2 -2 + 1 x 2 -3 + 1 x 2 -4 + 1 x 2 -5 + 1 x 2 -6
32 + 16 + 1 + 0.125 + 0.0625 + 0.03125 + 0.015625 = 49.234375

La conversion de la valeur décimale de la partie entière utilise les mêmes méthodes que pour les nombres non signés. Pour la partie fractionnaire, on utilise une suite de multiplications par 2 de la partie fractionnaire jusqu'à obtenir 0 pour la partie entière et pour la partie fractionnaire. La valeur binaire est composée de la suite des parties entières des résultats des multiplications.

49.23437510=110001.0011112

La partie entière 4910 vaut 1100012
On utilise une suite de multiplications par 2 pour la partie fractionnaire : 0.23437510

0.234375 × 2=0.46875
0.46875 × 2=0.9375
0.9375 × 2=1.875
0.875 × 2=1.75
0.75 × 2=1.5
0.5 × 2=1
0 × 2=0
La partie fractionnaire vaut : 0.0011112

Prendre un papier et un crayon, puis demander

Solution [ Voir ]

Une remarque importante : En base dix, où tous les nombres ne peuvent être exprimés avec un nombre fini de chiffres après la virgule. On a le même problème en base 2, ce qui provoque des calculs d'arrondis et quelques fois des erreurs de calculs.
Comme le montre le calcul, c'est le cas du la représentation binaire de 0.2 :
0.210=0.0011001100110011...2

0.2 × 2=0.4
0.4 × 2=0.8
0.8 × 2=1.6
0.6 × 2=1.2
0.2 × 2=0.4
0.4 × 2=0.8
0.8 × 2=1.6
0.6 × 2=1.2
0.2 × 2=0.4
Le tableau ci-dessous représente la valeur réelle par défaut enregistrée en fonction du nombre de bits
Nombre de bits valeur
80.19921875
120.199951171875
160.19999694824219
240.19999998807907
320.19999999995343

Réels en virgule flottante

La représentation virgule flottante est identique à la notation scientifique en base 10 qui utilise un nombre, nommé mantisse, multiplié par une puissance de 10. En base 2 on utilise une puissance de 2 ce qui donne N 10 = ( - 1 ) s ( 1 + m ) 2 e , avec s bit de signe (0 ou 1), m mantisse de type réel compris entre 0 et 1, et e exposant décalé pour obtenir des valeurs d'exposants négatifs. Un exposant décalé est de la forme e=E-D avec D décalage qui dépend du nombre de bits.
La norme IEEE 754 définit différentes précisions en fonction du nombre de bits affectés à la mantisse et à l'exposant. La valeur réelle est de la forme N 10 = ( - 1 ) s ( 1 + m ) 2 E - D . Les différentes précisions sont rappellées dans le tableau ci-dessous :

simpledoublequadruple
s (bits) 111
m (bits) 2352112
E (bits)81115
D (valeur)127102316383
valeur maxi±3.4×1038±1.8×10308±1.19×104932
valeur mini±2×10-126±2×10-1022±2×10-16382
précision relative2-23≈10-62-52≈10-152-112≈10-33
Il existe une représentation IEEE754 de π pour toutes ces précisions.

On peut calculer la représentation d'un nombre en virgule flottante en partant de la représentation en virgule fixe de ce nombre. Pour cela il suffit de décaler la valeur en virgule fixe pour obtenir la forme 1,m en ajoutant l'exposant qui correspond à ce décalage.

Pour exprimer 49.234375 au format simple précision,on part du format en virgule fixe qui est : 110001.00111100000000000000000, puis en décalant la virgule fixe de 5 à gauche, on obtient 1.10001001111000000000000, on obtient donc :
signe s0
mantisse m 10001001111000000000000
exposant décalé E10000100
La valeur enregistrée est bien : 49.234375.
Pour exprimer 0.2 au format simple précision,on part du format en virgule fixe qui est : .00110011001100110011001, puis en décalant la virgule fixe de 3 à droite, on obtient 1.10011001100110011001100, on obtient donc :
signe s0
mantisse m 10011001100110011001100
exposant décalé E01111100
La valeur enregistrée est : 0.19999998807907

Calcul des fonctions mathématiques

Algorithme CORDIC

CORDIC signifie COordinate Rotation DIgital Computer (calcul numérique par rotation de coordonnées).
C'est un algorithme de calcul des fonctions trigonométriques et hyperboliques qui a été décrit pour la première fois par Jack E. Volder en 1959.
Il a été utilisé dans les premières calculatrices, comme la HP-35 qui utilisait la notation polonaise inverse, car il est parfaitement adapté aux faibles puissances de calcul et aux faibles capacités mémoires. Il a été également utilisés dans les premiers ordinateurs des années 1970.
Le calcul, qui utilise les formules de trigonométrie, est ramené dans un intervalle restreint en utilisant les propriétés des fonctions mathématiques.

  1. Ramener l'angle sur l'intervalle [ - π , π ]
  2. Réduire à l'intervalle [ 0 , π 2 ]
    • x ] π 2 , π ] : θ = π - x
    • x [ - π , - π 2 [ : θ = π + x
  3. Calcul de x = cos ( θ ) et y = sin ( θ ) sur [ 0 , π 2 ] :
    • On part de x = 1 et y = 0 , c'est à dire θ = 0
    • On ajoute γ i jusqu'à atteindre θ , en calculant à chaque étape les nouvelles valeurs de x et y avec γ i = arctan ( 2 - i ) i représente la précision du calcul, le choix de la puissance de 2 facilite les calculs en binaire.
    • Lorsqu'on atteint θ , on obtient x = cos ( θ ) et y = sin ( θ ) sur [ 0 , π 2 ]

Le principe mathématique de ce calcul est la rotation dans le plan.
Pour calculer x = cos ( θ ) et y = sin ( θ ) sur [ 0 , π 2 ] , on calcule les nouvelles valeurs x i + 1 = cos ( θ i + 1 ) et y i + 1 = sin ( θ i + 1 ) en fonction des valeurs précédentes x i = cos ( θ i ) et y i = sin ( θ i ) en appliquant : θ i + 1 = θ i + γ i , cela donne les équations :

{ cos ( θ i + 1 ) = cos ( θ i + γ i ) sin ( θ i + 1 ) = sin ( θ i + γ i ) { cos ( θ i + 1 ) = cos ( θ i ) cos ( γ i ) - sin ( θ i ) sin ( γ i ) sin ( θ i + 1 ) = cos ( θ i ) sin ( γ i ) + sin ( θ i ) cos ( γ i )
En posant x i = cos ( θ i ) , y i = sin ( θ i ) , x i + 1 = cos ( θ i + 1 ) , y i + 1 = sin ( θ i + 1 ) on obtient :
( x i + 1 y i + 1 ) = ( cos ( γ i ) - sin ( γ i ) sin ( γ i ) cos ( γ i ) ) ( x i y i ) ( x i + 1 y i + 1 ) = cos ( γ i ) ( 1 - tan ( γ i ) tan ( γ i ) 1 ) ( x i y i )
Dans une calculatrice, on fonctionne en binaire, on pose : tan ( γ i ) = 2 - i γ i = arctan ( 2 - i ) ce qui donne :
( x i + 1 y i + 1 ) = cos ( arctan ( 2 - i ) ) ( 1 - 2 - i 2 - i 1 ) ( x i y i ) ( x i + 1 y i + 1 ) = 1 1 + 2 - 2 i ( 1 - 2 - i 2 - i 1 ) ( x i y i )
Le coefficient 1 1 + 2 - 2 i converge rapidement vers sa limite, et peut donc être considéré comme constant et mémorisé dans la machine, il vaut : lim n k = 0 n - 1 1 1 + 2 - 2 k 0.6073

En 1971, J. Walther, ingénieur chez Hewlett Packard, généralisa l'algorithme CORDIC aux fonctions hyperboliques, ce qui permit de calculer le logarithme, l'exponentielle ainsi que la racine carrée, en utilisant toujours les propriétés des fonctions afin de réduire l'intervalle de calcul.

La relation généralisée est :
{ x k + 1 = x k - m σ k y k 2 - k y k + 1 = y k + σ k x k 2 - k z k + 1 = z k - σ k ϵ k
En utilisant les différents paramètres de ces équations, on réalise deux fonctionnements qui correspondent aux fonctions trigonométriques (mode circulaire : m=1) et aux fonctions hyperboliques (mode hyperbolique : m=-1). Ensuite pour chacun de ces deux fonctionnements on a deux modes qui sont le mode rotation et le mode vecteur. C'est à partir de ces différents modes et fonctionnement que l'on obtient les différentes fonctions scientifiques des calculatrices.

Mode rotation
La fonction σk est une fonction qui retourne le signe de zk.
Mode circulaire

  • On initialise les valeurs x0=1 et y0=0.
  • On assigne la valeur θ : z0.
  • Le résultat est obtenu avec les valeurs xn et yn.
  • Le mode circulaire donne les résultats xn=cos(θ) et yn=sin(θ).
Mode Hyperbolique
  • les résultats sont xn=cosh(θ) et yn=sinh(θ).
  • Le résultat est également l'exponentielle xn=exp(θ) si on initialise avec x0=1 et y0=1

Mode vecteur
La fonction σk est une fonction qui retourne l'opposé du signe de yk.
Mode circulaire

  1. On assigne les coordonnées du vecteur aux valeurs x0=xv et y0=yv.
  2. On initialise la valeur z0=0.
  3. Les résultats sont le module (xn) et l'argument (zn=arctan(y0/x0)) du vecteur.
Mode hyperbolique
  1. Les résultats sont zn=argtanh(y0/x0)
  2. a , si on utilise les valeurs x0=a+0.25 et y0=a-0.25 alors x n = a .
  3. Le logarithme ln(a) si on utilise les valeurs x0=a+1 et y0=a-1 alors zn=2log(a).

Constantes de calculs
Pour le mode circulaire, on a déjà la constante multiplicative à appliquer au resultat : lim n k = 0 n - 1 1 1 + 2 - 2 k 0.6073 .
Pour le mode hyperbolique, on a également une constante multiplicative à appliquer au résultat : lim n k = 0 n - 1 1 1 - 2 - 2 k 1.205 .

Domaine de définition ou de convergence
Les calculs de l'algorithme CORDIC convergent vers la fonction uniquement dans un intervalle fini et limité. Cette Limite vient des valeurs extrêmes possible de l'angle θ (valeurs maximales possibles de z). Dans le fonctionnement trigonométrique, cette limite vaut | θ | < k = 0 arctan ( 2 - k ) 1.7 , ce qui valide le fait de travailler entre 0 et π/2.
Dans le fonctionnement hyperbolique, cette limite vaut | θ | < k = 0 a r g t a n h ( 2 - k ) 1.055 , cette limite implique une limite sur x0 et y0 dans le mode vecteur qui vaut y 0 x 0 0.78 .
Cela signifie qui faut utiliser les propriétés des fonctions pour étendre le calcul en dehors de ces limites, comme par exemple pour l'exponentielle en utilisant la relation x = q log ( 2 ) + r avec q entier, les valeurs de q et r se calculent de la façon suivante : q = x log ( 2 ) et r = x - q log ( 2 ) ainsi l'exponentielle devient e x = 2 q e r .

Autes références web

On peut de référer aux nombreuses publications et ouvrages de Jean-Michel Muller, comme par exemple ce livre "arithmétique des ordinateurs" ou bien en consultant le chapitre 11 de digital arithmetic