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

C++ Discussion :

Trouver la partie entière d'un double


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Par défaut Trouver la partie entière d'un double
    Salut:
    J'ai un petit problème, je suis cherché de trouver la partie entier d'un double.
    Voila mon code:
    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
    25
    26
    27
    28
    29
     
    #include <iostream>
    #include <math.h>
    double intpart(double x)
    {
           double intpart, fractpart;
           fractpart=modf(x, &intpart);
           return intpart;
           }
    int main()
    {
        double x,y, k;
        std::cout<<"Entrez x:"<<std::endl;
        std::cin>>x;
        std::cout<<"Entrez y:"<<std::endl;
        std::cin>>y;
        k=(1-y)/(2*y);
        std::cout<<"La partie entier de k est: "<<intpart(k)<<std::endl;
        if(x<0)
        {
        if((double)intpart(k)==k)
        std::cout<<"Procédure1"<<std::endl ;
        else
        std::cout<<"Procédure2"<<std::endl;
        }
        char rep;
        std::cin>>rep;
        return 0;
    }
    Mais quand met x=-8 et y=0.2, la partie entier de k normalement 2, mais il m'affiche 1!.
    Et quand je met dans la fonction intpart de return 1+intpart;
    La fonction if de Prcédure1 ne marche pas et il m'affiche Procédure2!
    Quelle est l'erreur stp, et merci d'avance.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Pour obtenir la partie entière, il y a beaucoup plus simple, il suffit de mettre le float (ou double) dans un entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double intpart(double x)
    {
       int part_int = static_cast<int>(x);
       return static_cast<double>(part_int);
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par tagtog Voir le message
    Quelle est l'erreur stp, et merci d'avance.
    Croire que 0.2 est représentable exactement dans un flottant.

    Citation Envoyé par ram-0000 Voir le message
    Pour obtenir la partie entière, il y a beaucoup plus simple, il suffit de mettre le float (ou double) dans un entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double intpart(double x)
    {
       int part_int = static_cast<int>(x);
       return static_cast<double>(part_int);
    }
    Ça ne fonctionne que pour l'intervalle des doubles représentables dans un int. Classiquement un double est capable de coder exactement les entiers jusque 2^53, les int jusque 2^31.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Ça ne fonctionne que pour l'intervalle des doubles représentables dans un int. Classiquement un double est capable de coder exactement les entiers jusque 2^53, les int jusque 2^31.
    C'est vrai !! Un long long int alors (64 bits) ? Mais je ne fais que repousser un peu plus loin le problème.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    En plus du problème de la précision des flottants, il y a souvent un autre problème lié à la définition de la partie entière des nombres négatifs.

    Dans mes cours de math, on m'a toujours dit : E(x) est le plus grand nombre entier inférieur ou égal à x. Ce qui fait que E(-0.2) == -1.

    Mais en informatique, la définition est autre (on pourrait dire que la partie entière est la fonction symétrique définie sur R+ comme E(x)), et static_cast<int>(-0.2) == 0. Il vaut mieux utiliser floor si on veut le comportement mathématique.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    il y a effectivement 4 façons de transformer un flottant en entier : floor, ceil, round et truncate
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Par défaut
    Merci
    Donc il y a plusieurs méthodes de trouver la partie entière d'un double ou, et je trouvé ceil et round pratiquement donne meilleur précision dans mon code. Merci encore
    Mais, il reste comment, dans mon exemple pour x=-8.0 et y=0.2 donc ici k=2 et par la fonction ceil ou round je trouve aussi ceil(k)=2. (donc ceil(2)==2).
    mais pour quoi la construction if(ceil(k)==k) procédure1; ne marche pas. parce que dans mon code il m'affiche procédure2 c-à-d if(ceil(k)!=k) procédure2; !

Discussions similaires

  1. Réponses: 13
    Dernier message: 20/04/2009, 11h53
  2. partie entière d'un double
    Par charnet3d dans le forum Débuter
    Réponses: 2
    Dernier message: 22/01/2009, 03h35
  3. UDF-Interbase qui renvoie la partie entière d'un décimal
    Par mondelphi dans le forum InterBase
    Réponses: 2
    Dernier message: 20/06/2005, 16h46
  4. partie entière supérieure
    Par pmboutteau dans le forum ASP
    Réponses: 3
    Dernier message: 10/03/2005, 10h31
  5. Fonction retournant la partie entière d'un nombre
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/11/2004, 15h58

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