Bug? Ou j'ai raté quelque chose? Boucle for à résultats étranges...

Bug? Ou j'ai raté quelque chose? Boucle for à résultats étranges... - PHP - Programmation

Marsh Posté le 01-04-2008 à 23:31:58    

Bonsoir,
Je voulais faire une boucle for sur une variable $i de -1 à 1 et avec un pas de 0.1.

 

J'essaie donc ce code (c'est la source de pleins d'ennuis en version simple) :

 
Code :
  1. <?php
  2. for($i=-1;$i<1;$i+=0.1)
  3.        echo $i,'<br />';
  4. ?>


-1
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
-1.38777878078E-16
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

 

Dans le doute je suis repassé par la doc mais rien qui n'interdise un tel emploie de for.
D'autant plus que si j'évite le passage par 0, avec un pas de 0.3 par exemple aucun problème.
En revanche, avec 0.2, c'est le même problème mais pas le même résultat...

 

Ais-je loupé quelque chose?
Par avance, milles excuses si j'ai oublié d'aller lire quelque chose!

 

(Toutes mes calculatrices confirment, -0.1 + 0.1 = 0.)

 

Edit :
Même résultat avec un while :

Code :
  1. <?php
  2. $i = -1;
  3. while($i<1)
  4. {
  5.        echo $i,'<br />';
  6.        $i += 0.1;
  7. }
  8. ?>
 

alors que :

Code :
  1. <?php
  2. $i=-0.1;
  3. $i+=0.1;
  4. echo $i;
  5. ?>

me donne bien 0.

 

Ya un truc avec les boucles?


Message édité par dwogsi le 01-04-2008 à 23:45:44

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 01-04-2008 à 23:31:58   

Reply

Marsh Posté le 01-04-2008 à 23:47:01    

je ne sais pas non plus mais en attendant, tu peux pit-être faire une boucle de -10 à 10 et diviser par 10 dans la boucle ?

 


mais c'est vrai que groumpf...


Message édité par art_dupond le 01-04-2008 à 23:48:02

---------------
oui oui
Reply

Marsh Posté le 01-04-2008 à 23:49:49    

quand on part de -0.1 ça marche
edit de -0.2 aussi mais plus de -0.3 :??:


Message édité par art_dupond le 01-04-2008 à 23:51:10

---------------
oui oui
Reply

Marsh Posté le 01-04-2008 à 23:50:55    

Oui ça pour une solution alternative c'est ce que j'ai finit par faire,mais j'aimerais quand même comprendre. Ça le fait aussi chez toi?

 

En tout cas j'ai faillit m'arracher les cheveux avec ce truc, mon code qui partait dans des boucles pas possibles (du fait des calcules qui découlent de ces résultats).

 

Edit : oui en effet en partant de "moins loin" ça marche normalement, étrange...


Message édité par dwogsi le 01-04-2008 à 23:52:15

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 01-04-2008 à 23:52:45    

ouais j'imagine l'horreur pour débugger  :pt1cable:  
 
 
ça doit être un bug non ? le comportement qui change en fonction de la valeur de départ...
 


---------------
oui oui
Reply

Marsh Posté le 01-04-2008 à 23:53:52    

avec des pas de 0.01, ça coince à -1 et à 0


---------------
oui oui
Reply

Marsh Posté le 02-04-2008 à 00:00:42    

edit: idem avec

 
Code :
  1. echo -0.3 + 0.1 + 0.1 + 0.1;



Message édité par art_dupond le 02-04-2008 à 00:04:37

---------------
oui oui
Reply

Marsh Posté le 02-04-2008 à 00:14:04    

non ce n'est pas un bug :)

 

c'est l'éternel problème des floats qui est normal apparemment puisque les floats par définition c'est des approximations.

 

on a eu une discussion sur le sujet récemment (sur ce meme forum) et le problème y exposé plus clairement :)

 

bienvenue dans le fabuleux monde des floats (j'ai aussi failli m'arracher les cheveux avec ça il y a quelques jours :))

 


Edit : voici le topic dont je parle : http://forum.hardware.fr/hfr/Progr [...] 2949_1.htm

Message cité 1 fois
Message édité par naeh le 02-04-2008 à 00:17:29
Reply

Marsh Posté le 02-04-2008 à 00:24:57    

oh intéressant. Heureusement que je vous me faites découvrir ça maintenant :)
 
J'imagine les nuits blanches que j'aurais pu passer à cause de ça :sweat:


---------------
oui oui
Reply

Marsh Posté le 02-04-2008 à 00:30:57    

naeh a écrit :

non ce n'est pas un bug :)
 
c'est l'éternel problème des floats qui est normal apparemment puisque les floats par définition c'est des approximations.
 
on a eu une discussion sur le sujet récemment (sur ce meme forum) et le problème y exposé plus clairement :)
 
bienvenue dans le fabuleux monde des floats (j'ai aussi failli m'arracher les cheveux avec ça il y a quelques jours :))
 
 
Edit : voici le topic dont je parle : http://forum.hardware.fr/hfr/Progr [...] 2949_1.htm


 
Oui je suis bien au courant du problème de la représentation binaire interne avec les float.
Et je ne fais pas de comparaison dessus.
Mais j'ai quand même un peu de mal à croire que c'est la seule raison pour laquelle on obtient pareil résultat, ou alors php s'en sort très mal avec les float.
 
Parce qu'avec un bou de code à la con en C :

Code :
  1. #include "stdio.h"
  2. int main(void)
  3. {
  4.        float i;
  5.        for(i=-1;i<1;i+=0.1)
  6.                printf("%f\n",i);
  7.        return 0;
  8. }


ça marche à merveille !
 
-1.000000
-0.900000
-0.800000
-0.700000
-0.600000
-0.500000
-0.400000
-0.300000
-0.200000
-0.100000
0.000000
0.100000
0.200000
0.300000
0.400000
0.500000
0.600000
0.700000
0.800000
0.900000
 
Oui je sais, j'ai qu'a retourner faire du C...

Message cité 1 fois
Message édité par dwogsi le 02-04-2008 à 00:31:38

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 02-04-2008 à 00:30:57   

Reply

Marsh Posté le 02-04-2008 à 00:35:45    

ce que je ne comprends pas, c'est que ça "bug" à zéro mais qu'ensuite ça remarche comme on s'y attend.
Si c'est une erreur d'arrondi, ça devrait s'amplifier et ne pas se produire qu'en zéro non ?

 

mais je suppose que je dois lire la doc donnée sur l'autre topic


Message édité par art_dupond le 02-04-2008 à 00:36:48

---------------
oui oui
Reply

Marsh Posté le 02-04-2008 à 00:40:27    

Complètement d'accord, ça devrait s'enchaîner logiquement.
J'en reviens au C, si on prend de plus grands écarts dans une boucle on tombe sur un problème similaire mais quand même plus logique, un petit extrait de résultats :

 

-0.500003
-0.400003
-0.300003
-0.200003
-0.100003
-0.000003
0.099997
0.199997
0.299997
0.399997
0.499997

 

Pourtant que ce soit du php ou du C, c'est bien la même représentation binaire?
(Ou alors je viens de dire une grosse connerie?)


Message édité par dwogsi le 02-04-2008 à 00:42:30

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 02-04-2008 à 09:57:50    

dwogsi a écrit :

Mais j'ai quand même un peu de mal à croire que c'est la seule raison pour laquelle on obtient pareil résultat


Ben tu crois mal. Maintenant, prière d'aller lire What Every Computer Scientist Should Know About Floating-Point Arithmetic et d'arrêter de poster des questions à la con sur des problèmes qui n'existent pas.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 04-04-2008 à 09:00:45    

masklinn a écrit :


Ben tu crois mal. Maintenant, prière d'aller lire What Every Computer Scientist Should Know About Floating-Point Arithmetic et d'arrêter de poster des questions à la con sur des problèmes qui n'existent pas.


 
du calme quoi  :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed