Contenus |
Capacités attendues |
Commentaires |
---|---|---|
Représentation approximative des nombres réels: notion de nombre flottant |
Représentation approximative des nombres réels: notion de nombre flottant |
|
Nous avons appris à encoder des nombres entiers naturels, et relatifs, et nous avons vu que les limites physiques des machines imposaient des limites sur l'étendue des valeurs. Par exemple, sur un octet on dispose de valeurs distinctes qui permettent d'encoder:
Maintenant que nous allons tenter de coder les réels, les limites de notre machine vont encore entraîner des limites sur l'étendue des valeurs, mais également sur la précision des valeurs.
Ainsi, si on effectue le calcul en Python, on obtient:
>>> 0.2 + 0.1
0.30000000000000004
Et contre toute attente, certains tests que l'on aurait cru positifs renvoient des valeurs négatives(ce que l'on appelle un faux négatif):
>>> 0.2 + 0.1 == 0.3
False
En informatique plutôt que parler d'encodage des réels, on préfère parler de nombres flottants(floating point en anglais), car il existe une infinité de réels infiniment proches les uns des autres, or en informatique, nous serons forcément limités dans l'étendue et la proximité des nombres à virgule.
Ainsi un calcul avec des nombres à virgule ne peut-être qu'approximatif. Cependant plus on augmente la taille du registre du processeur et plus nous pourrons représenter de valeurs, et plus nos calculs gagneront en précision.
Comme nous sommes limités sur la précision des flottants, on transforme les tests d'égalités en tests d'inégalités à une précision donnée.
Ainsi:
>>> 0.2 + 0.1 == 0.3
False
Par contre, en utilisant une précision du millionième:
>>> import math # pour utiliser la fonction valeur absolue fabs()
>>> precision = 1E-6
>>> math.fabs((0.2 + 0.1) - 0.3) < precision
True
D'ailleurs la bibliothèque math
de Python inclut à cet effet la
fonction math.isclose()
.
On représente un nombre à virgule sous la forme:
« IEEE754
Format General » par GMjeanmatt — Travail
personnel. Sous licence CC BY-SA 3.0 via Wikimedia Commons.
Supposons un nombre flottant codé sur un octet utilisant 1 bit de signe, 3 bits pour l'exposant et
4 bits pour la mantisse: 1 101 1011
est le signe représenté par le bit de poids fort:
Notre codage représente donc un nombre négatif.
L'exposant a pour valeur 101
codé sur 3 bits, il doit être décalé de
. Ainsi,
puisque ,
l'exposant 101
correspond à un exposant de 5-3=2.
Dans notre exemple, la mantisse est: 1011
, elle représentera le nombre:
Le code 1 101 1011
sur un octet utilisant 1 bit de signe, 3 bits pour
l'exposant et 4 bits pour
la mantisse représente donc:
L’IEEE 754 est une norme pour la représentation des nombres à virgule flottante en binaire. Elle est la norme la plus employée actuellement pour le calcul des nombres à virgule flottante dans le domaine informatique. Source Wikipedia
Cette norme définit notamment 2 formats pour représenter des nombres à virgule flottante:
Par GMjeanmatt — Travail personnel, CC BY-SA 3.0, Lien
Par GMjeanmatt — Travail personnel, CC BY-SA 3.0, Lien