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 :

Détection d'un entier après une opération


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut Détection d'un entier après une opération
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
     
    $num = 8;
     
    function racine($nbr, $racine){
    return pow ((float)$nbr, (1/$racine));
    }
     
    echo racine($num, 3).'<br/>';
    if (is_float(racine($num, 3)))
    	echo 'ce n\'est pas un entier';
    		else
    			echo 'c\'est un entier';
     
    ?>
    Je pense que vous voyez le problème , il y a-t-il une solution ?

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 715
    Par défaut
    Citation Envoyé par devtrack Voir le message
    Je pense que vous voyez le problème
    non je ne vois pas, qu'est ce que tu souhaites obtenir ?

  3. #3
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Oui j'ai pas vraiment expliquer .
    Si tu teste le code tu vois 2 et en dessous ce n'est pas un entier . Or 2 est un entier .
    En fait je souhaite une fonction ( ou un algorithme ) qui me dit que 2.00 est un entier , 2.01 n'est pas un entier , 65.00 est un entier ect... je crois que tu as compris mon problème .

    Merci d'avance .

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 715
    Par défaut
    essaie peut-être la fonction http://php.net/intval

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $r = racine($num, 3);
    if ($r != intval($r))
    	echo 'ce n\'est pas un entier';
    else
    	echo 'c\'est un entier';

  5. #5
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Ca marche nikel merci !

  6. #6
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Je regarderai demain mais il y a plus que 3 racines cubiques entières de 2 à 10000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for ($num=2;$num<=10000;++$num) {
     
    $r = racine($num, 3);
    if ($r != intval($r))
    	echo '';
    else
    	echo $num.'<br/>';
     
    }
     
    //8
    //27
    //125

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Par défaut
    http://fr3.php.net/manual/fr/function.is-int.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    if (is_int(23)) {
     echo "est un entier\n";
    } else {
     echo "n'est pas un entier\n";
    }
    var_dump(is_int(23));
    var_dump(is_int("23"));
    var_dump(is_int(23.5));
    var_dump(is_int(true));
    ?>

  8. #8
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    if (is_int(23.0)) {
     echo "est un entier\n";
    } else {
     echo "n'est pas un entier\n";
    }
    //affiche ce n'est pas un entier
    var_dump(is_int(23.0));
    //affiche bool(false)
    ?>
    Même en ayant mis une virgule , il faut qu'il détecte que c'est quand même un entier .

  9. #9
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    J'ai essayer autrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
     
    function est_entier($num) {
    	if ( $num - intval($num) == 0 )
    		return 1;
    	else
    		return 0;
    }
     
    function racine($nb, $racine){
    return pow ((float)$nb, (1/$racine));
    }
     
     
    for ($i=2;$i<10000;++$i) {
    	if ( est_entier(racine($i,3)) ) echo $i.'<br/>';
    }
     
    //8
    //27
    //125
     
     
    ?>
    64 c'est 4 au cube or 4 est un entier , pourtant il ne le marque pas .

  10. #10
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Effectivement, le résultat est étonnant :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print "<pre>";
    $myVar = pow(64, 1/3);
    var_dump($myVar);
    var_dump(intval($myVar));
    $myVar = $myVar - intval($myVar);
    var_dump($myVar);
    print "</pre>";

    Affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float(4)
    int(3)
    float(1)
    A analyser...

  11. #11
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Et bien ça c'est intéressant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    print "<pre>";
    $myVar = (float)bcpow(64, 1/3);
    var_dump($myVar);
    var_dump(intval($myVar));
    $myVar = $myVar - intval($myVar);
    var_dump($myVar);
    print "</pre>";
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string(1) "1"
    int(1)
    int(0)
    Sûrement un problème de précision. Mieux vaut utiliser les fonctions BC Math.

  12. #12
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Ca aussi c'est intéressant , (très énervant aussi) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
     
    print pow(64,1/3).' -> '.intval(pow(64,1/3)).' ???';
     
    ?>
    ça explique beaucoup de choses .

  13. #13
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    D'où l'obligation de passer par les fonctions BC...

  14. #14
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Citation Envoyé par jml94 Voir le message
    D'où l'obligation de passer par les fonctions BC...
    oui mais bcpow ne marche pas avec une puissance inférieure à 1 ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php echo (float)bcpow(64,1/3); ?>
    // donne 1
    et bcsqrt n'accepte pas de paramètre pour le degrés de la racine .

  15. #15
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Il existe une extension GMP qui a l'air prometteuse.
    Je vais la tester de suite sur notre problème.
    http://us2.php.net/GMP

  16. #16
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php print var_dump(pow(64,1/3)).' -> '.intval(pow(64,1/3)).' ?<br/>';
    print var_dump(4.00).' -> '.intval(4.00).'<br/>';
     
    if (4.00 == pow(64,1/3)) {
    	echo 'pas trés logique tout ça ...';
    }else { echo 'Ah , voilà ! Pourquoi ils sont pas pareils ?'; } ?>

  17. #17
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    A mon avis ça viens de l'algorithme pour calculer une racine , je sais plus ou je l'ai vu mais j'ai vu qu'ils utilisaient une méthode transcendantale pour la calculer , au quel cas je suis bien dans la merde ( pardon mais le mot est juste ) .

    Le truc c'est pourquoi l'ordi me montre 4 alors que c'est 3.99999999999999999356 (par exemple) .

  18. #18
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Bon GMP ne sert à rien.

    Par contre, j'ai eu cette idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print "<pre>";
    $myVar = (float)pow(64, 1/3);
    var_dump($myVar);
    var_dump(floatval($myVar));
    $myVar = $myVar - floatval($myVar);
    var_dump($myVar);
    print "</pre>";
    Qui donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float(4)
    float(4)
    float(0)
    Ca pourrait répondre à la question de départ, même s'il reste une grosse zone d'ombre...

  19. #19
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Par défaut
    Ca peut être bon , peut-être avec une astuce , je vais voir ça parce que à première vu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    print "<pre>";
    $myVar = (float)pow(5, 1/3);
    var_dump($myVar);
    var_dump(floatval($myVar));
    $myVar = $myVar - floatval($myVar);
    var_dump($myVar);
    if ($myVar == 0) { echo 'racine cubique de 5 un entier ? '; }
     
    print "</pre>";
    Le problème c'est que je suis obligé d'utilisé intval un moment ou un autre .
    en tout cas merci de ton aide

  20. #20
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Il va falloir commencer à parler "aux erreurs de précision près" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    print "<pre>";
    $myVar = pow(64, 1/3);
    var_dump($myVar);
    var_dump(ceil($myVar));
    $epsilon = abs($myVar - ceil($myVar));
    var_dump($epsilon);
    if ($epsilon < 1E-10)
        print "entier";
    else
        print "pas entier";
    print "</pre>";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float(4)
    float(4)
    float(4.4408920985006E-16)
    entier

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Refus de mise à jour apres une opération de clone
    Par Jean-Marc_RL dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/09/2013, 17h54
  2. [WD10] comment rendre un bouton grisé après une opération?
    Par amilas dans le forum WinDev
    Réponses: 2
    Dernier message: 23/08/2009, 17h09
  3. Réponses: 2
    Dernier message: 21/08/2009, 16h36
  4. Réponses: 2
    Dernier message: 31/03/2008, 11h27
  5. [VBA-EXCEL] - Effectué une opération après sauvegarde
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/12/2006, 16h36

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