Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2011, 20h40   #1
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 0
Points : 0
Par défaut [enigme] 830.88<830.88 est vrai

bonjour,

si vous analysez ce code, vous conviendrez que le echo n'est exécuté que si la condition du for est vérifiée
Code :
1
2
3
4
5
6
<?php
$max=830.88;
$step=$max/5;
for($i=0;$i<$max;$i+=$step)
  echo "$i<$max<br>";
?>
si vous exécutez ce code, vous verrez afficher 830.88<830.88, ce qui implique que php considère que c'est vrai...

avez-vous une explication rationnelle ???
reggubed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 20h50   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonjour,

Je t'invite à regarder l'énorme avertissement sur cette page concernant la comparaison de float entre eux.
Ensuite ragardes cette page, tu y trouveras toutes les explications concernant la gestion des nombres décimaux en PHP

Enfin pour manipuler les nombres décimaux, il faut utiliser BCMath ou les fonctions gmp
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 21h17   #3
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 0
Points : 0
merci pour ton message, mais je n'ai pas trouvé la réponse

ta 1ère page avertit sur le test d'égalité entre décimaux, ce n'est pas ce qui est fait ici
ta 2nde page avertit sur la précision des décimaux de l'ordre de 1.11e-16, or 830.88/5=166.176, on n'est pas non plus concerné par ça
les fonctions BC Math concernent les nombres de grande taille
les fonctions gmp ne sont pas disponibles par défaut


d'autres idées ??
reggubed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 21h39   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Tu n'as pas bien lu :
Citation:
Aussi, les nombres rationnels exactement représentables sous forme de nombre à virgule flottante en base 10, comme 0.1 ou 0.7, n'ont pas e de représentation exacte comme nombres à virgule flottante en base 2, utilisée en interne
Dans ton cas cela veut dire tout simplement que 830.88 est représenté en interne comme 830.8799999999999999 (par exemple) et ta variable $step ($max/5) est encore plus arrondie car ton $max est déjà arrondi par défaut.
Donc à cause de la propagation des arrondis et de la représentation des décimaux en base 2, tu ne peux arriver à une valeur rationnelle. Elle est obligatoirement irrationnelle en interne. Au mieux, à la dernière comparaison tu auras quelque chose du genre 830.879999999999998 < 830.8799999999999999.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/10/2011, 21h53   #5
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 0
Points : 0
ok ça me convient

ça explique alors pourquoi cette modification corrige le bug
Code :
for($i=0;$i+1e-9<$max;$i+=$step)
merci
reggubed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 22h10   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par reggubed Voir le message
ok ça me convient[/code]
J'en suis fort aise

Citation:
Envoyé par reggubed Voir le message
cette modification corrige le bug
Je t'arrête, ce n'est pas un bug. C'est inhérent à la technologie.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 23h02   #7
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 881
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 881
Points : 7 658
Points : 7 658
Quelque soit le langage, quelque soit la technologie, le système d'exploitation, le processeur, etc ... on n'utilise pas les nombres à virgule flottante simple (float) ou double (double) précision si on veut une exactitude parfaite des calculs.

Les types float ou double, de part leur constitution, ne peuvent pas représenter la totalité des nombres à virgule. Les nombres non représentés sont arrondi au nombre représentable le plus proche.

Si on a besoin de nombre parfaitement exact, il faut utiliser le type Decimal (appelé parfois Curency), mais il n'existe pas dans tous les langages.
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 13h38   #8
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur Web
Inscription : décembre 2006
Messages : 2 335
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2006
Messages : 2 335
Points : 3 774
Points : 3 774
Citation:
Envoyé par sevyc64 Voir le message
Quelque soit le langage, quelque soit la technologie, le système d'exploitation, le processeur, etc ... on n'utilise pas les nombres à virgule flottante simple (float) ou double (double) précision si on veut une exactitude parfaite des calculs.

Les types float ou double, de part leur constitution, ne peuvent pas représenter la totalité des nombres à virgule. Les nombres non représentés sont arrondi au nombre représentable le plus proche.
+1
__________________
Développeur | Zend Certified Engineer

Étapes Pour mieux se servir du forum:
1. Commencez par lire les cours et tutoriels ;
2. Faites une recherche;
3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

Nix>_Rien n'est plus pratique que la théorie
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 02
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h28.


 
 
 
 
Partenaires

Hébergement Web