Représentation des flottants Informatique pour tous Informatique pour tous Représentation des flottants Représentations pour les différents types de nombres La plupart des langages de programmation représentent : 1 Les entiers positifs par leur écriture en base 2. 2 Les entiers relatifs par leur codage par complément à 2. 3 Les flottants par la norme IEEE-754. Informatique pour tous Représentation des flottants Représentations pour les différents types de nombres La plupart des langages de programmation représentent : 1 Les entiers positifs par leur écriture en base 2. 2 Les entiers relatifs par leur codage par complément à 2. 3 Les flottants par la norme IEEE-754. Le module de calcul scientifique numpy permet de spécifier comment on veut représenter un nombre. Informatique pour tous Représentation des flottants Entiers positifs Avec p bits, on peut représenter tous les entiers positifs de : < 00...00 | {z } >2 p Informatique pour tous à < 11...11 | {z } >2 = p Représentation des flottants Entiers positifs Avec p bits, on peut représenter tous les entiers positifs de : < 00...00 | {z } >2 p à p < 11...11 | {z } >2 = 2 − 1 p Dans numpy, les nombres positifs sont de type uint (unsigned int), suivi du nombre de bits p utilisé : Informatique pour tous Représentation des flottants Entiers positifs C’est un dépassement d’entier qui a causé le crash d’Ariane 5 ! Informatique pour tous Représentation des flottants Entiers relatifs Le codage par complément à 2 (sur p bits) représente tous les entiers n ∈ {−2p−1 , ..., 2p−1 − 1} : 1 Si n ≥ 0, on représente n par son écriture en base 2. 2 Si n < 0, on représente n par l’écriture en base 2 de n + 2p ≥ 0. 0 0 0 ... 0 0 0 représente : Informatique pour tous Représentation des flottants Entiers relatifs Le codage par complément à 2 (sur p bits) représente tous les entiers n ∈ {−2p−1 , ..., 2p−1 − 1} : 1 Si n ≥ 0, on représente n par son écriture en base 2. 2 Si n < 0, on représente n par l’écriture en base 2 de n + 2p ≥ 0. 0 0 0 ... 0 0 0 représente : 0 0 1 1 ... 1 1 1 représente : Informatique pour tous Représentation des flottants Entiers relatifs Le codage par complément à 2 (sur p bits) représente tous les entiers n ∈ {−2p−1 , ..., 2p−1 − 1} : 1 Si n ≥ 0, on représente n par son écriture en base 2. 2 Si n < 0, on représente n par l’écriture en base 2 de n + 2p ≥ 0. 0 0 0 ... 0 0 0 représente : 0 0 1 1 ... 1 1 1 représente : 2p−1 − 1 1 0 0 ... 0 0 0 représente : Informatique pour tous Représentation des flottants Entiers relatifs Le codage par complément à 2 (sur p bits) représente tous les entiers n ∈ {−2p−1 , ..., 2p−1 − 1} : 1 Si n ≥ 0, on représente n par son écriture en base 2. 2 Si n < 0, on représente n par l’écriture en base 2 de n + 2p ≥ 0. 0 0 1 car 1 0 0 ... 0 1 1 ... 1 0 0 ... 0 < −2p−1 + 2p 0 0 ... 0 0 0 1 1 0 0 >2 = 0 1 Informatique pour tous représente : 0 représente : 2p−1 − 1 représente : −2p−1 , < 2p−1 (−1 + 2) >2 = < 2p−1 >2 représente : Représentation des flottants Entiers relatifs Le codage par complément à 2 (sur p bits) représente tous les entiers n ∈ {−2p−1 , ..., 2p−1 − 1} : 1 Si n ≥ 0, on représente n par son écriture en base 2. 2 Si n < 0, on représente n par l’écriture en base 2 de n + 2p ≥ 0. 0 0 1 car 1 1 0 0 ... 0 1 1 ... 1 0 0 ... 0 < −2p−1 + 2p 0 0 ... 0 1 1 ... 1 0 0 1 1 0 0 >2 = 0 1 1 1 Informatique pour tous représente : 0 représente : 2p−1 − 1 représente : −2p−1 , < 2p−1 (−1 + 2) >2 = < 2p−1 >2 représente : −2p−1 + 1 représente : Représentation des flottants Entiers relatifs Le codage par complément à 2 (sur p bits) représente tous les entiers n ∈ {−2p−1 , ..., 2p−1 − 1} : 1 Si n ≥ 0, on représente n par son écriture en base 2. 2 Si n < 0, on représente n par l’écriture en base 2 de n + 2p ≥ 0. 0 0 1 car 1 1 0 0 ... 0 1 1 ... 1 0 0 ... 0 < −2p−1 + 2p 0 0 ... 0 1 1 ... 1 0 0 1 1 0 0 >2 = 0 1 1 1 Informatique pour tous représente : 0 représente : 2p−1 − 1 représente : −2p−1 , < 2p−1 (−1 + 2) >2 = < 2p−1 >2 représente : −2p−1 + 1 représente : −1 Représentation des flottants Entiers relatifs 0 0 1 1 1 0 1 0 0 1 0 1 0 0 1 ... ... ... ... ... 0 1 0 0 1 0 1 0 0 1 Informatique pour tous 0 1 0 1 1 représente représente représente représente représente : : : : : 0 2p−1 − 1 −2p−1 −2p−1 + 1 −1 Représentation des flottants Entiers relatifs Le type int classique de python utilise une représentation par complément à 2 sur 64 bits mais s’agrandit automatiquement si la taille de l’entier dépasse 263 − 1. Il n’y a donc pas de limite de taille des int de python. Informatique pour tous Représentation des flottants Entiers relatifs Le type int classique de python utilise une représentation par complément à 2 sur 64 bits mais s’agrandit automatiquement si la taille de l’entier dépasse 263 − 1. Il n’y a donc pas de limite de taille des int de python. En caml (option info), les entiers utilisent une représentation par complément à 2 sur 64 bits, qui ne se redimensionnent pas. Informatique pour tous Représentation des flottants Flottants Question Comment représenter les nombres à virgules ? Informatique pour tous Représentation des flottants Flottants Question Comment représenter les nombres à virgules ? Par définition, 0,1415 = 1 × 10−1 + 4 × 10−2 + 1 × 10−3 + 5 × 10−4 . Informatique pour tous Représentation des flottants Flottants Question Comment représenter les nombres à virgules ? Par définition, 0,1415 = 1 × 10−1 + 4 × 10−2 + 1 × 10−3 + 5 × 10−4 . Définition : développement en base b < 0, x−1 x−2 ... >b = x−1 × b −1 + x−2 × b −2 + .... Informatique pour tous Représentation des flottants Flottants Question Comment représenter les nombres à virgules ? Par définition, 0,1415 = 1 × 10−1 + 4 × 10−2 + 1 × 10−3 + 5 × 10−4 . Définition : développement en base b < 0, x−1 x−2 ... >b = x−1 × b −1 + x−2 × b −2 + .... Exemple : < 0, 101 >2 = Informatique pour tous Représentation des flottants Flottants Question Comment représenter les nombres à virgules ? Par définition, 0,1415 = 1 × 10−1 + 4 × 10−2 + 1 × 10−3 + 5 × 10−4 . Définition : développement en base b < 0, x−1 x−2 ... >b = x−1 × b −1 + x−2 × b −2 + .... Exemple : < 0, 101 >2 = Informatique pour tous 1 2 + 1 23 = 0, 625 (= < 0, 625 >10 ) Représentation des flottants Flottants Question Comment représenter les nombres à virgules ? Par définition, 0,1415 = 1 × 10−1 + 4 × 10−2 + 1 × 10−3 + 5 × 10−4 . Définition : développement en base b < 0, x−1 x−2 ... >b = x−1 × b −1 + x−2 × b −2 + .... Exemple : < 0, 101 >2 = 1 2 + 1 23 = 0, 625 (= < 0, 625 >10 ) < 1, 01010101... >2 = Informatique pour tous Représentation des flottants Flottants Question Comment représenter les nombres à virgules ? Par définition, 0,1415 = 1 × 10−1 + 4 × 10−2 + 1 × 10−3 + 5 × 10−4 . Définition : développement en base b < 0, x−1 x−2 ... >b = x−1 × b −1 + x−2 × b −2 + .... 1 2 + 1 23 = 0, 625 (= < 0, 625 >10 ) < 1, 01010101... >2 = 1 + 1 22 + 1 24 Exemple : < 0, 101 >2 = Informatique pour tous + 1 26 ... = 1 40 + 1 4 + 1 42 + Représentation des flottants 1 43 ...= Flottants Question Comment représenter les nombres à virgules ? Par définition, 0,1415 = 1 × 10−1 + 4 × 10−2 + 1 × 10−3 + 5 × 10−4 . Définition : développement en base b < 0, x−1 x−2 ... >b = x−1 × b −1 + x−2 × b −2 + .... 1 2 + 1 23 = 0, 625 (= < 0, 625 >10 ) < 1, 01010101... >2 = 1 + 1 = 43 . 1− 1 1 22 + 1 24 Exemple : < 0, 101 >2 = + 1 26 ... = 1 40 + 1 4 + 1 42 + 4 Informatique pour tous Représentation des flottants 1 43 ...= Flottants Question Comment passer d’un développement de 0 < x < 1 en base 10 à un développement dans une autre base b ? On veut écrire x sous la forme x =< 0, x−1 x−2 x−3 ... >b . Informatique pour tous Représentation des flottants Flottants Question Comment passer d’un développement de 0 < x < 1 en base 10 à un développement dans une autre base b ? On veut écrire x sous la forme x =< 0, x−1 x−2 x−3 ... >b . 1 x×b = Informatique pour tous Représentation des flottants Flottants Question Comment passer d’un développement de 0 < x < 1 en base 10 à un développement dans une autre base b ? On veut écrire x sous la forme x =< 0, x−1 x−2 x−3 ... >b . 1 x × b = < x−1 , x−2 x−3 ... >b , donc x−1 = Informatique pour tous Représentation des flottants Flottants Question Comment passer d’un développement de 0 < x < 1 en base 10 à un développement dans une autre base b ? On veut écrire x sous la forme x =< 0, x−1 x−2 x−3 ... >b . 1 x × b = < x−1 , x−2 x−3 ... >b , donc x−1 = bx × bc. 2 Pour trouver x−2 , on refait la même chose sur x × b − x−1 = < 0, x−2 x−3 ... >b . 3 ... Informatique pour tous Représentation des flottants Flottants Question Comment passer d’un développement de 0 < x < 1 en base 10 à un développement dans une autre base b ? On veut écrire x sous la forme x =< 0, x−1 x−2 x−3 ... >b . 1 x × b = < x−1 , x−2 x−3 ... >b , donc x−1 = bx × bc. 2 Pour trouver x−2 , on refait la même chose sur x × b − x−1 = < 0, x−2 x−3 ... >b . 3 ... Exemples : 0,625 = < 0, ? >2 Informatique pour tous Représentation des flottants Flottants Question Comment passer d’un développement de 0 < x < 1 en base 10 à un développement dans une autre base b ? On veut écrire x sous la forme x =< 0, x−1 x−2 x−3 ... >b . 1 x × b = < x−1 , x−2 x−3 ... >b , donc x−1 = bx × bc. 2 Pour trouver x−2 , on refait la même chose sur x × b − x−1 = < 0, x−2 x−3 ... >b . 3 ... Exemples : 0,625 = < 0, 1? >2 1 0,625 × 2 = 1, 25 Informatique pour tous Représentation des flottants Flottants Question Comment passer d’un développement de 0 < x < 1 en base 10 à un développement dans une autre base b ? On veut écrire x sous la forme x =< 0, x−1 x−2 x−3 ... >b . 1 x × b = < x−1 , x−2 x−3 ... >b , donc x−1 = bx × bc. 2 Pour trouver x−2 , on refait la même chose sur x × b − x−1 = < 0, x−2 x−3 ... >b . 3 ... Exemples : 0,625 = < 0, 10? >2 1 0,625 × 2 = 1, 25 2 0, 25 × 2 = 0, 5 Informatique pour tous Représentation des flottants Flottants Question Comment passer d’un développement de 0 < x < 1 en base 10 à un développement dans une autre base b ? On veut écrire x sous la forme x =< 0, x−1 x−2 x−3 ... >b . 1 x × b = < x−1 , x−2 x−3 ... >b , donc x−1 = bx × bc. 2 Pour trouver x−2 , on refait la même chose sur x × b − x−1 = < 0, x−2 x−3 ... >b . 3 ... Exemples : 0,625 = < 0, 101 >2 1 0,625 × 2 = 1, 25 2 0, 25 × 2 = 0, 5 3 0, 5 × 2 = 1 Informatique pour tous Représentation des flottants Flottants Question Écrire un algorithme python pour passer d’un développement de 0 < x < 1 en base 10 à la base 2. Informatique pour tous Représentation des flottants Flottants Question Écrire un algorithme python pour passer d’un développement de 0 < x < 1 en base 10 à la base 2. Informatique pour tous Représentation des flottants Flottants Ensuite, pour passer un flottant de la base 10 à la base 2, on convertit sa partie entière et sa partie fractionnaire. Informatique pour tous Représentation des flottants Flottants B x peut avoir un développement décimal fini mais infini en base 2 : 0,1 = < 0, 000110011001100110011001100... >2 Informatique pour tous Représentation des flottants Flottants B x peut avoir un développement décimal fini mais infini en base 2 : 0,1 = < 0, 000110011001100110011001100... >2 Comme on ne peut stocker qu’un nombre fini de chiffres sur un PC, python fait une troncature donc une approximation. Il ne faut donc jamais tester une égalité entre deux flottants ! Informatique pour tous Représentation des flottants Flottants Il ne faut donc jamais tester une égalité entre deux flottants ! Si x et y sont deux flottants, plutôt qu’écrire : On écrira : Informatique pour tous Représentation des flottants Flottants Question Comment stocker un flottant en mémoire ? Informatique pour tous Représentation des flottants Flottants Question Comment stocker un flottant en mémoire ? On utilise la notation scientifique : 932, 134 = 9, 32134 × 102 < 1001, 011 >2 = Informatique pour tous Représentation des flottants Flottants Question Comment stocker un flottant en mémoire ? On utilise la notation scientifique : 932, 134 = 9, 32134 × 102 23 < 1001, 011 >2 = 1, 001011 | {z } × |{z} mantisse Informatique pour tous 2exposant Représentation des flottants Norme IEEE-754 Python code les flottants sur 64 bits : 1 1 bit pour le signe (0 si ≥ 0, 1 si < 0) 2 11 bits pour l’exposant : de −210 + 1 = −1023 à 210 = 1024 3 52 bits (chiffres significatifs) pour l’écriture en base 2 de la mantisse : de 0, 00...00 | {z } à 0, 11...11 | {z } 52 Informatique pour tous 52 Représentation des flottants Norme IEEE-754 Python code les flottants sur 64 bits : 1 1 bit pour le signe (0 si ≥ 0, 1 si < 0) 2 11 bits pour l’exposant : de −210 + 1 = −1023 à 210 = 1024 3 52 bits (chiffres significatifs) pour l’écriture en base 2 de la mantisse : de 0, 00...00 | {z } à 0, 11...11 | {z } 52 52 Exemple : 1 0 ... 0 1 1 0 ... 0 1 1 0 représente : Informatique pour tous Représentation des flottants Norme IEEE-754 Python code les flottants sur 64 bits : 1 1 bit pour le signe (0 si ≥ 0, 1 si < 0) 2 11 bits pour l’exposant : de −210 + 1 = −1023 à 210 = 1024 3 52 bits (chiffres significatifs) pour l’écriture en base 2 de la mantisse : de 0, 00...00 | {z } à 0, 11...11 | {z } 52 52 Exemple : 1 0 ... 0 1 1 0 ... 0 1 1 0 représente : - 1, 6 × 2? Informatique pour tous Représentation des flottants Flottants B Ainsi, il peut y avoir dépassement de float dans python : Informatique pour tous Représentation des flottants Flottants B Seul 52 chiffres significatifs sont stockés, on peut avoir des problèmes d’arrondis : Informatique pour tous Représentation des flottants Flottants B Seul 52 chiffres significatifs sont stockés, on peut avoir des problèmes d’arrondis : Question Que fait l’algorithme suivant ? Informatique pour tous Représentation des flottants