Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1856 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1711312
dwogsi
Défaillance cérébrale...
Posté le 01-04-2008 à 23:31:58  profilanswer
 

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})/
mood
Publicité
Posté le 01-04-2008 à 23:31:58  profilanswer
 

n°1711315
art_dupond
je suis neuneu... oui oui !!
Posté le 01-04-2008 à 23:47:01  profilanswer
 

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
n°1711316
art_dupond
je suis neuneu... oui oui !!
Posté le 01-04-2008 à 23:49:49  profilanswer
 

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
n°1711317
dwogsi
Défaillance cérébrale...
Posté le 01-04-2008 à 23:50:55  profilanswer
 

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})/
n°1711318
art_dupond
je suis neuneu... oui oui !!
Posté le 01-04-2008 à 23:52:45  profilanswer
 

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
n°1711319
art_dupond
je suis neuneu... oui oui !!
Posté le 01-04-2008 à 23:53:52  profilanswer
 

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


---------------
oui oui
n°1711321
art_dupond
je suis neuneu... oui oui !!
Posté le 02-04-2008 à 00:00:42  profilanswer
 

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
n°1711323
naeh
Posté le 02-04-2008 à 00:14:04  profilanswer
 

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
n°1711328
art_dupond
je suis neuneu... oui oui !!
Posté le 02-04-2008 à 00:24:57  profilanswer
 

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
n°1711329
dwogsi
Défaillance cérébrale...
Posté le 02-04-2008 à 00:30:57  profilanswer
 

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})/
mood
Publicité
Posté le 02-04-2008 à 00:30:57  profilanswer
 

n°1711330
art_dupond
je suis neuneu... oui oui !!
Posté le 02-04-2008 à 00:35:45  profilanswer
 

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
n°1711332
dwogsi
Défaillance cérébrale...
Posté le 02-04-2008 à 00:40:27  profilanswer
 

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})/
n°1711398
masklinn
í dag viðrar vel til loftárása
Posté le 02-04-2008 à 09:57:50  profilanswer
 

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
n°1712577
tomsoft
Posté le 04-04-2008 à 09:00:45  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Macro avec boucle "For Each Feuille" pour une partie du nomBug Sous IE
résultats de checkbox[VBA] Bug de VBA EXCEL
Problème "simple" (?) de boucleBug IE - texte d'un LI qui se répète
PHP Aide sur une boucleProblème boucle de recherche sous VBA sur Excel
Boucle sur excelComment faire une boucle dans un if
Plus de sujets relatifs à : Bug? Ou j'ai raté quelque chose? Boucle for à résultats étranges...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR