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).
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).
On distingue les entiers non signés (ensemble ℕ) et les entiers signés (ensemble ℤ).
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 :
.
Cette relation permet de convertir un nombre exprimé en base 2 en un nombre exprimé en base 10.
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.
1 | 7 | 3 | 2 | |||||||||||||||||||
1 | 3 | 8 | 6 | 2 | ||||||||||||||||||
1 | 0 | 6 | 4 | 3 | 2 | |||||||||||||||||
0 | 0 | 3 | 2 | 1 | 2 | |||||||||||||||||
1 | 0 | 1 | 1 | 0 | 2 | |||||||||||||||||
1 | 0 | 5 | 2 | |||||||||||||||||||
1 | 2 | 2 | ||||||||||||||||||||
0 | 1 | 2 | ||||||||||||||||||||
1 | 0 |
L'exemple ci-contre donne la conversion de 173 en base 2
Le résultat est 17310=101011012
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
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
on déduit que 17310= 101011012
Pour représenter les nombres négatifs dans une base, on utilise le complément à la base en utilisant la relation 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 . 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 : .
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.
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 | |||||||||
0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | → | 73 | 73 | ||
+ | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | → | 173 | -83 | |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | → | 246 | -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 :
1 | 1 | 1 | 1 | 1 | valeur non signée | valeur signée | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | → | 247 | -9 | ||
+ | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | → | 92 | 92 | |
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | → | 339 | 83 |
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.
1 | 1 | 1 | 1 | valeur non signée | valeur signée | |||||||
0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | → | 106 | 106 | ||
+ | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | → | 61 | 61 | |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | → | 167 | -89 |
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.
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | = | 83 | |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | |||
+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ||
1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | = | -83 |
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.
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 |
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 |
Nombre de bits | valeur |
---|---|
8 | 0.19921875 |
12 | 0.199951171875 |
16 | 0.19999694824219 |
24 | 0.19999998807907 |
32 | 0.19999999995343 |
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 ,
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
.
Les différentes précisions sont rappellées dans le tableau ci-dessous :
simple | double | quadruple | |
---|---|---|---|
s (bits) | 1 | 1 | 1 |
m (bits) | 23 | 52 | 112 |
E (bits) | 8 | 11 | 15 |
D (valeur) | 127 | 1023 | 16383 |
valeur maxi | ±3.4×1038 | ±1.8×10308 | ±1.19×104932 |
valeur mini | ±2×10-126 | ±2×10-1022 | ±2×10-16382 |
précision relative | 2-23≈10-6 | 2-52≈10-15 | 2-112≈10-33 |
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.
signe s | 0 |
mantisse m | 10001001111000000000000 |
exposant décalé E | 10000100 |
signe s | 0 |
mantisse m | 10011001100110011001100 |
exposant décalé E | 01111100 |
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.
Le principe mathématique de ce calcul est la rotation dans le plan.
Pour calculer
et
sur ,
on calcule les nouvelles valeurs
et
en fonction des valeurs précédentes
et
en appliquant : ,
cela donne les équations :
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.
Mode rotation
La fonction σk est une fonction qui retourne le signe de zk.
Mode circulaire
Mode vecteur
La fonction σk est une fonction qui retourne l'opposé du signe de yk.
Mode circulaire
Constantes de calculs
Pour le mode circulaire, on a déjà la constante multiplicative à appliquer au resultat :
.
Pour le mode hyperbolique, on a également une constante multiplicative à appliquer au résultat :
.
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 ,
ce qui valide le fait de travailler entre 0 et π/2.
Dans le fonctionnement hyperbolique, cette limite vaut ,
cette limite implique une limite sur x0 et y0 dans le mode vecteur qui vaut .
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
avec q entier, les valeurs de q et r se calculent de la façon suivante :
et
ainsi l'exponentielle devient .
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