Bug? Ou j'ai raté quelque chose? Boucle for à résultats étranges... - PHP - Programmation
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...
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
Marsh Posté le 02-04-2008 à 00:30:57
naeh a écrit : non ce n'est pas un bug |
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 :
|
ç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...
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
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?)
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.
Marsh Posté le 04-04-2008 à 09:00:45
masklinn a écrit : |
du calme quoi
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) :
-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 :
alors que :
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})/