J'ai un problème avec ce petit algorithme qui me rend fou !!
T=1;
t=0;
while t<=T
if t==0.1
disp('ok')
t=t+0.01;
else
t=t+0.01;
end
end
Selon Matlab, t n'est jamais égal à 0.1 !!! c'est incompréhensible
Merci
-----
08/04/2010, 17h16
#2
invitede8302a1
Date d'inscription
janvier 1970
Messages
144
Re : Algorithme Matlab
et si jamais j'utilise un for à la place... ça marche
qq'un peut m'expliquer ?
08/04/2010, 19h56
#3
danyvio
Date d'inscription
octobre 2006
Localisation
Lyon
Âge
82
Messages
3 479
Re : Algorithme Matlab
Peux tu joindre la version avec "for" ?
On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !
09/04/2010, 09h14
#4
invitede8302a1
Date d'inscription
janvier 1970
Messages
144
Re : Algorithme Matlab
salut voilà les deux versions :
for t=0:0.01:1
t==0.1
pause
end
vs
t=0;
while t<=1
t==0.1
pause
t=t+0.01;
end
voilà, dans un cas, t sera à un moment égal à 0.1, dans l'autre cas NON !!! je crois que j'hallucine
essayez vous allez voir !!
Aujourd'hui
A voir en vidéo sur Futura
10/04/2010, 19h15
#5
danyvio
Date d'inscription
octobre 2006
Localisation
Lyon
Âge
82
Messages
3 479
Re : Algorithme Matlab
Envoyé par james_83
salut voilà les deux versions :
for t=0:0.01:1
t==0.1
pause
end
vs
t=0;
while t<=1
t==0.1
pause
t=t+0.01;
end
voilà, dans un cas, t sera à un moment égal à 0.1, dans l'autre cas NON !!! je crois que j'hallucine
essayez vous allez voir !!
Je ne suis pas xpert en matlab, mais je ne vois pas ce que font les lignes t==0.1 ?
t==0.1 n'est pas une instruction d'affectation de valeur, mais pourrait être un élément de comparaison:
On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !
11/04/2010, 08h44
#6
invite15928b85
Date d'inscription
janvier 1970
Messages
1 023
Re : Algorithme Matlab
Bonjour.
Le problème est lié au calcul en virgule flottante par le processeur de la machine (Matlab n'a rien à voir là-dedans). 0.01 n'a pas de représentation exacte dans la machine. Les additions successives dans la boucle while finissent par générer une erreur d'arrondi non négligeable, alors que la boucle for fait le calcul autrement.
Conclusion, on ne teste jamais l'égalité de deux nombres en virgule flottante en faisant a == b, on teste leur écart |a - b| < epsilon, où epsilon est déterminé en fonction du contexte. C'est un truc bien connu ...