Python et opérations numériques

Python et opérations numériques

Messagede physix » 23 Oct 2019, 11:07

Bonjour,
je suis en train de me mettre à python et je rencontre un problème récurrent quand je fais des calculs en python.

Code: Tout sélectionner
>>> 0.1+0.2
0.30000000000000004
>>>

:shock:

C'est un problème de codage des réels en python bien documenté.
Je n'avais jamais rencontré ce problème quand je programmais en Turbo Pascal ou Delphi ou n'importe quel langage de calculatrice.
J'ai vu que le problème existe en C ou d'autres langages.
Ça n'a pas l'air de gêner les gens le moins du monde mais personnellement je trouve ça énorme.

Comment gérez-vous ça avec vos élèves ?
Perte de la 4ème "Aide et soutien" - Perte de la 3ème d'insertion - Perte de la ZEP - Perte des groupes - 2021 : plus rien à perdre.
physix
 
Messages: 1042
Inscription: 09 Jan 2011, 10:41
Académie: Grenoble
Poste: Enseignant en Collège

Re: Python et opérations numériques

Messagede gts2 » 23 Oct 2019, 15:09

Le problème est le même en Pascal et dans tout langage (sauf langages spéciaux type Mathematica, Maple qui sont capable de faire des calculs exacts).

test fait en Pascal
0,1+0,2=0,30000001 (single sur 4 octets)
0,1+0,2=0,299999999999999989 (double sur 8 octets)

Pour Python, cela doit être sur 8 octets.

Pour ce qui est des calculatrices, je n'ai pas de référence précise, mais on peut imaginer des calculs avec 12 chiffres et affichage de 10 chiffres.
gts2
 
Messages: 330
Inscription: 19 Fév 2019, 10:49
Académie: Orléans-Tours
Poste: Enseignant en Classes préparatoires

Re: Python et opérations numériques

Messagede physix » 23 Oct 2019, 15:31

En Lazarus :

2019-10-23 16-27-29.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Perte de la 4ème "Aide et soutien" - Perte de la 3ème d'insertion - Perte de la ZEP - Perte des groupes - 2021 : plus rien à perdre.
physix
 
Messages: 1042
Inscription: 09 Jan 2011, 10:41
Académie: Grenoble
Poste: Enseignant en Collège

Re: Python et opérations numériques

Messagede physix » 23 Oct 2019, 15:50

En turbo pascal 7 :

2019-10-23 16-48-32.png


2019-10-23 16-48-16.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Perte de la 4ème "Aide et soutien" - Perte de la 3ème d'insertion - Perte de la ZEP - Perte des groupes - 2021 : plus rien à perdre.
physix
 
Messages: 1042
Inscription: 09 Jan 2011, 10:41
Académie: Grenoble
Poste: Enseignant en Collège

Re: Python et opérations numériques

Messagede physix » 23 Oct 2019, 15:56

Par contre, je retrouve le problème avec :
https://rextester.com/EKM27267

Quoi qu'il en soit, comment procède-t-on avec les élèves quand on a un langage qui ne calcule pas correctement en base 10 ?
Perte de la 4ème "Aide et soutien" - Perte de la 3ème d'insertion - Perte de la ZEP - Perte des groupes - 2021 : plus rien à perdre.
physix
 
Messages: 1042
Inscription: 09 Jan 2011, 10:41
Académie: Grenoble
Poste: Enseignant en Collège

Re: Python et opérations numériques

Messagede gts2 » 23 Oct 2019, 16:42

Pour ce qui est des langages, Lazarus/FreePascal a le même problème.
La différence Python/Lazarus vient que par défaut dans FreePascal, l'affichage se fait de manière "court" (je n'ai pas cherché le détail) et qu'il faut formater par FloatToStrF ou autre pour avoir plus de chiffres.
Dans Python l'affichage par défaut est le maximum de chiffres.
On peut formater dans Python avec par exemple
a=0.1+0.2
print("%.2f" % a)
qui donne bien 0.30

On peut aussi utiliser la bibliothèque decimal qui fait des calculs exacts.
https://docs.python.org/2/library/decimal.html

Pour ce qui est de "comment procède-t-on avec les élèves quand on a un langage qui ne calcule pas correctement en base 10".
Si c'est juste de l'affichage : formatage, ce qui de plus est cohérent avec le point de vue des physiciens sur l'usage des chiffres significatifs.
Si c'est du calcul, il faut qu'ils sachent que dans tout langage informatique, les calculs en flottant ne sont pas exacts (ce qu'ils ont du apprendre lorsqu'ils ont appris Python) et qu'en particulier il n'est pas raisonnable de faire des tests d'égalité de flottants.
gts2
 
Messages: 330
Inscription: 19 Fév 2019, 10:49
Académie: Orléans-Tours
Poste: Enseignant en Classes préparatoires

Re: Python et opérations numériques

Messagede physix » 23 Oct 2019, 18:36

OK. Merci pour tes explications.

Apparemment, c'est un gros sujet : https://0.30000000000000004.com :roll:
Perte de la 4ème "Aide et soutien" - Perte de la 3ème d'insertion - Perte de la ZEP - Perte des groupes - 2021 : plus rien à perdre.
physix
 
Messages: 1042
Inscription: 09 Jan 2011, 10:41
Académie: Grenoble
Poste: Enseignant en Collège

Re: Python et opérations numériques

Messagede gts2 » 23 Oct 2019, 18:59

Pour préciser le fait qu'en TurboPascal, on ait l'impression que cela est exact, cela provient du fait qu'il y a au maximum 12 chiffres affichés et que les calculs sont faits avec 15 (double sur 8 octets).
C'est donc le même principe que pour les calculatrices.
En extended (10 octets), je n'arrive pas à mettre l'affichage en défaut (car le nombre de chiffres est limité à 18 alors que le calcul se fait avec 19), par contre un test d'égalité de deux nombres égaux échoue.
gts2
 
Messages: 330
Inscription: 19 Fév 2019, 10:49
Académie: Orléans-Tours
Poste: Enseignant en Classes préparatoires

Re: Python et opérations numériques

Messagede steph59400 » 27 Oct 2019, 10:50

Pour revenir à ta question initiale, Physix, pour en parler aux élèves :

je leur montre aussi que 0.1+0.2-0.3 ne fais pas 0 ce que les interpelle (juste un peu... :lol:, faut pas pousser !).

Par contre, pour le justifier, j'explique que l'ordinateur doit convertir chaque nombre en une suite de 0 et de 1, que cette écriture (mantisse) n'est pas infinie, et que du coup, le calcul est forcément entaché d'une "imprécision", tout comme on peut nous même avoir parfois des problèmes comparables...
Exemple simple :
1/3 = 0.33333333333
2/3 = 0.66666666666 (je tronque juste l'écriture)
donc 1/3 + 2/3 = 0.99999999999 par addition des deux décimaux.
Juste sur ce petit exemple, les élèves saisissent qu'en effet, l'écriture tronquée de nombres peut entrainer des résultats erronés lors d'opérations.

De là, j'avais il y a trois ans en ICN (seconde) montrer qu'il y a les triangles mathématiques rectangles (vérifiant exactement a^2 = b^2 + c^2) et qu'il y a des triangles informatiquement rectangles (vérifiant la même relation, à un epsilon près en raison de cette imprécision).

Stéphane
steph59400
 
Messages: 387
Inscription: 29 Sep 2011, 20:51
Académie: LILLE
Poste: Enseignant en Lycée

Re: Python et opérations numériques

Messagede vinceom » 01 Nov 2019, 10:19

Oh la vache la capture d'écran de turbo pascal sous DOS ... back in 1992 pendant mon DEUG A...
vinceom
 
Messages: 279
Inscription: 11 Juin 2012, 10:44
Académie: Marseille
Poste: Enseignant en Lycée

Suivante

Retourner vers Informatique et Numérique

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités

cron