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 :

partie entière d'un double


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Par défaut partie entière d'un double
    Salut tout le monde,
    je suis un étudiant débutant en langage C, j'ai eu une idée de crée un clone de printf, et en cours de développement j'ai eu un problème avec la fonction qui me renvoie le nombre de caractère qui représentent un double.
    ma fonction s'appelle len_real(double reel_d), voila son corps:

    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
    int len_real(double reel_d)
    {
        int len = 0, intp;    // decp: partie entière
        double floatp;           // partie flottante
     
        floatp = reel_d - (int)reel_d;     // calcule la partie flottante
     
        // on calcule la partie entière (ici ça marche)
        decp = (int)(reel_d - floatp); 
     
        // Longueur de floatp
        while(floatp != 0.0)
        {
         floatp *= 10;      // exemple: 0.98765 devient 9.8765
         floatp -= (int)floatp;     // exemple: 9.8765 devient 0.8765
         len++;   
        }
       /* après on remarque que la boucle n'a pas bien marché,
          quand elle arrive à la phase où floatp == 5.0, la deuxième ligne donne un
          comportement bizarre, (int)floatp nous renvoie 4 à la place de 5 (la partie entière de 5.0)
        */
     
    /* Jusqu'ici len contiendra le nombre de caractères qui representent la partie flottante*/
     
        len += len_int(intp); 
    /* on ajoute le nombre de caractères de la partie entière avec la fonction len_int(int entier) que j'ai déjà déclaré*/
        len++; // et enfin on ajoute 1 pour la virgule
        return len;
    }

    dans main()

    j'ai fait l'appel suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double a = 1234.98765;
    printf("%i\n",len_real(a));

    donc si vous pouvez m'indiquer où j'ai l'erreur, ou bien si c'est le défaut de l'opérateur du casting, dites moi s'il y a une autre fonction capable de donner la partie entière.

    et Merci d'avance ^^

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Un double (comme un float ou un long double) ne peut pas représenter exactement toutes les valeurs.
    Selon le cas, il prendra la valeur la plus proche ou par défaut ou par excès qui est représentable par un double.

    Il est possible que la valeur effective prise ici par a ne soit pas 1234.98765 mais quelque chose du genre 1234.98764999... d'où le 4 qui apparait.
    Si cette valeur effective est égale à 1234.98765000000003 on aura 5 (mais un nombre de chiffres élevé).

    Pour ce programme qui simule un printf, il vaut mieux (comme le fait printf) que le format comporte la précision d'affichage et faire un arrondi sur le dernier chiffre.

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Par défaut
    euh je vois maintenant, merci infiniment, donc je pense je vais retourner à la methode la plus basique c'est d'utiliser un sprintf et transformer le double en chaine, en ayant la possiblité de changer le nombre de chiffres affichés après la virgule , ça va rendre le travaille un peu plus avancée mais pas impossible..

    Merci encore une fois pour l'info

Discussions similaires

  1. Trouver la partie entière d'un double
    Par tagtog dans le forum C++
    Réponses: 6
    Dernier message: 22/03/2010, 19h27
  2. Réponses: 13
    Dernier message: 20/04/2009, 11h53
  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