IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[enigme] 830.88<830.88 est vrai


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ???

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    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

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut
    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 ??

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Tu n'as pas bien lu :
    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.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut
    ok ça me convient

    ça explique alors pourquoi cette modification corrige le bug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for($i=0;$i+1e-9<$max;$i+=$step)
    merci

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    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.

Discussions similaires

  1. Oui C'est vrai
    Par bledfeet dans le forum Mon site
    Réponses: 0
    Dernier message: 27/03/2012, 17h40
  2. Test si une MFC est vrai
    Par ponspons dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 28/05/2010, 18h43
  3. est ce que c'est vrai il y a des mises à jours pour le office?
    Par oussamadag dans le forum Microsoft Office
    Réponses: 1
    Dernier message: 20/01/2010, 01h17
  4. J'en perds mon latin (pas très élevé, c'est vrai)
    Par laurentSc dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 15/10/2009, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo