Surprenant! Boggue de Python ou mauvaise implementation?

Discutez d'informatique ici !
Kvas²
Membre Naturel
Messages: 23
Enregistré le: 20 Juin 2012, 12:35

surprenant! Boggue de Python ou mauvaise implementation?

par Kvas² » 11 Sep 2012, 10:38

Bonjour à tous, me revoilà avec une nouvelle discussion!

Sans plus tarder, voilà mon code python :

def values(debut,fin,pas):
vals=list()
print 'lala ', debut, fin, pas, vals
i=fin
while i>=debut :
print 'adding ....',i
vals.append(i)
i=i-pas
print 'fini ...',vals
return vals


Ce fonction a pour objectif de générer une liste décroissante de nombres compris entre debut et fin.
Mais surprenant le résultat obtenu pour la commande
values(0.0,1.1,0.1)

lala 0.0 1.1 0.1 []
adding .... 1.1
adding .... 1.0
adding .... 0.9
adding .... 0.8
adding .... 0.7
adding .... 0.6
adding .... 0.5
adding .... 0.4
adding .... 0.3
adding .... 0.2
adding .... 0.1
adding .... 1.38777878078e-16
fini ... [1.1, 1.0, 0.9, 0.8, 0.7000000000000001, 0.6000000000000001, 0.5000000000000001, 0.40000000000000013, 0.30000000000000016, 0.20000000000000015, 0.10000000000000014, 1.3877787807814457e-16]

AU LIEU DE :
lala 0.0 1.1 0.1 []
adding .... 1.1
adding .... 1.0
adding .... 0.9
adding .... 0.8
adding .... 0.7
adding .... 0.6
adding .... 0.5
adding .... 0.4
adding .... 0.3
adding .... 0.2
adding .... 0.1
adding .... 0.0
fini ... [1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0]

Des commentaires? Car je n'y comprends rien!



SaintAmand
Membre Rationnel
Messages: 901
Enregistré le: 17 Oct 2011, 11:47

par SaintAmand » 11 Sep 2012, 11:12

Kvas² a écrit:Des commentaires? Car je n'y comprends rien!


Bienvenue dans le monde du numérique. Il n'y a aucun bug. Comment un ordinateur, qui ne dispose que d'une mémoire fini peut-il représenter l'ensemble des réels, qui même restreint à un petit intervalle, est infini ? Il ne peut pas. Il faut approximer. Le même problème se pose pour la représentation des couleurs. En JPEG, on dispose de 256 niveaux de rouge, de vert et de bleu pour représenter les couleurs soit 16 millions de couleurs ce qui ne permet pas de représenter toutes les couleurs présente dans la Nature. Plus généralement, on est confronté à ce type de problème dès que l'on passe de l'analogique (continu) au numérique (discret). Problème que connaissent tous les graphistes, les ingénieurs du son, et les numériciens.

Kvas²
Membre Naturel
Messages: 23
Enregistré le: 20 Juin 2012, 12:35

par Kvas² » 11 Sep 2012, 12:54

SaintAmand a écrit:Bienvenue dans le monde du numérique. Il n'y a aucun bug. Comment un ordinateur, qui ne dispose que d'une mémoire fini peut-il représenter l'ensemble des réels, qui même restreint à un petit intervalle, est infini ? Il ne peut pas. Il faut approximer. Le même problème se pose pour la représentation des couleurs. En JPEG, on dispose de 256 niveaux de rouge, de vert et de bleu pour représenter les couleurs soit 16 millions de couleurs ce qui ne permet pas de représenter toutes les couleurs présente dans la Nature. Plus généralement, on est confronté à ce type de problème dès que l'on passe de l'analogique (continu) au numérique (discret). Problème que connaissent tous les graphistes, les ingénieurs du son, et les numériciens.

Je comprend que la memoire soit finie mais c'est pas pour autant de 2.0+2.0 donnera 4.000011!

Si c'etait vraiment un problème de représentation de nombre, alors la représentation du pas aurait elle changé les resultats seulement à la 5ieme itération?
Je pense plutôt que si l'un des floattants etait mal représenté, les resultats aurait été faussés dès le depart!

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 11 Sep 2012, 13:02

c'est ni une mauvaise implem, ni un bug.
C'est une limitation.

Ca te choque pas 1.38777878078e-16?
et pourtant quand on regarde
0.7000000000000001 comme par hasard lerreur arrive au 16eme digit?
la vie est une fête :)

Kvas²
Membre Naturel
Messages: 23
Enregistré le: 20 Juin 2012, 12:35

par Kvas² » 11 Sep 2012, 14:56

Alors tu affirme qu'il s'agit bien d'une erreur Fatal error?

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 11 Sep 2012, 16:52

non j'affirme pas que c'est une erreur.
C'est comme ca.

Quand tu mesures la temperature et que ton thermometre te dit 26.1 au lieu de 26.1112 c'est une erreur? non, c'est juste que ton thermometre est pas assez precis. Il ne te permet pas de representer 26.1112
la vie est une fête :)

Joker62
Membre Transcendant
Messages: 5027
Enregistré le: 24 Déc 2006, 19:29

par Joker62 » 11 Sep 2012, 17:03

Moi j'ai un thermomètre qui me donne la température en développement dyadique !

Luc
Membre Irrationnel
Messages: 1806
Enregistré le: 28 Jan 2006, 12:47

par Luc » 11 Sep 2012, 17:06

Kvas² a écrit:Je comprend que la memoire soit finie mais c'est pas pour autant de 2.0+2.0 donnera 4.000011!

Si c'etait vraiment un problème de représentation de nombre, alors la représentation du pas aurait elle changé les resultats seulement à la 5ieme itération?
Je pense plutôt que si l'un des floattants etait mal représenté, les resultats aurait été faussés dès le depart!

Il faut bien comprendre que tous les logiciels de calcul, et toutes les calculatrices donnent leur résultat modulo une précision (en Matlab, c'est %eps). Pour eux, si un nombre positif est plus petit que cette précision, il est nul.

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 11 Sep 2012, 17:29

Kvas² a écrit:Alors tu affirme qu'il s'agit bien d'une erreur Fatal error?


Salut Kyas², l'erreur vient de la représentation du nombre 0.7 en machine.

On écrit un nombre comme:

Il est composé d'une signe, d'une mantisse: , d'une base et d'un exposant , tous entiers avec: [tex]0= debut:
print 'adding ....', i
vals.append(i)
i -= pas
return vals

values(d.Decimal('0'), d.Decimal('1.1'), d.Decimal('0.1'))[/code]

Voir: http://docs.python.org/library/decimal.html

Kvas²
Membre Naturel
Messages: 23
Enregistré le: 20 Juin 2012, 12:35

par Kvas² » 12 Sep 2012, 11:30

Merci Iroh!

C'est exactement cela qu'il me fallait!

Pour recuperer en float il suffit donc que je caste le resultat final en float.

 

Retourner vers ϟ Informatique

Qui est en ligne

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

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite