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 :

approximer un nombre réel


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Par défaut approximer un nombre réel
    bonjours;

    comment approximer un nombre de type float ?
    exemple : 1/3=0.333.....
    je veux avoir comme r&sultat ceci : 1/3=0.3334

    cordialement

  2. #2
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Salut,

    Me concernant, je ne connais pas de fonction standard pour faire cela.

    Si tu cherches à faire un arrondis,
    l'arrondis d'1/3 au 10000 ieme n'est pas 0.3334 mais 0.3333

    Si je devais faire une fonction d'arrondis je ferais comme ca :

    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
    #include <stdio.h>
    #include <stdio.h>
    #include <string.h>
     
    float arrondis( float x, int precision )
    {
        int a=((int)(10.*precision*x));
        if ((a%10)>5)
            a+=1;
        float b = a/(10.*precision);
        return b;
    }
     
    int main()
    {
        float a=1./3.;
        float b=3./7.;
        int p2 = 100;
        int p4 = 10000;
        printf("\n %.15f => arrondis au %d-ieme a %.4f", a, p4, arrondis(a,p4));
        printf("\n %.15f => arrondis au %d-ieme a %.2f", b, p2, arrondis(b,p2));
        return 0;
    }

    Ce qui donne à l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     0.333333343267441 => arrondis au 10000-ieme a 0.3333
     0.428571432828903 => arrondis au 100-ieme a 0.43
    Faut penser, à formater l'affichage du float dans le printf à la précision souhaitée car à cause de l'imprécision des float, il peut trainer des trucs louches derrière.

    Au 10 ieme => %.1f
    Au 20 ieme => %.2f etc...

    Remarque, quand tu vois la valeur de 1/3 affichée, tu vois rapidement que la précision ce n'est pas trop ça. A partir d'une certaine précision, les résultats ne seront pas très probants je suppose.
    On peut comprendre pourquoi il n'y ait pas de fonctions standards pour faire la chose ?

    Cdt.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Citation Envoyé par darkwall_37 Voir le message
    Si tu cherches à faire un arrondis,
    l'arrondis d'1/3 au 10000 ieme n'est pas 0.3334 mais 0.3333
    Il y a plusieurs façon d'arrondir.

    Cf Wikipedia

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Par ailleurs, je rappelle que les nombres flottants ne sont pas des réels, mais une notation binaire permettant d'avoir une approximation assez bonne.

    Voyez le nombre flottant par wikipedia.

    le double atténue fortement ce problème, mais ne le résoud pas.

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Par défaut
    la fonction proposé dans la réponse 1 me fait la tâche !
    donc merci à tous

  6. #6
    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
    Faut penser, à formater l'affichage du float dans le printf à la précision souhaitée car à cause de l'imprécision des float, il peut trainer des trucs louches derrière.
    Oui, mais alors tout le travail est fait par le printf() (qui fait également un arrondi à sa convenance):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        //  a=2./3. p4 = 10000
        printf("\n %.15f => arrondis au %d-ieme a %.4f", a, p4, arrondis(a,p4));
        // Résultat : 0.666666686534882 => arrondis au 10000-ieme a 0.6667
        printf("\n %.15f => arrondis au %d-ieme a %.4f", a, p4,a);
        // donne aussi :0.666666686534882 => arrondis au 10000-ieme a 0.6667
    Et le test n'est absolument pas significatif.

    Il faut admettre qu'il y aura des trucs "louches" derrière, c'est inhérent au codage des flottants, et les cacher n'est pas une solution. On manipulera ensuite les vrais nombres obtenus par l'arrondi, pas leur représentation par le printf()
    Si on veut voir la réalité, on constatera une anomalie dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        //  a=2./3. p4 = 10000
        printf("\n %.15f => arrondis au %d-ieme a %.4f", a, p4, arrondis(a,p4));
        // Résultat : 0.666666686534882 => arrondis au 10000-ieme a 0.6667
        printf("\n %.15f => arrondis au %d-ieme a %.15f", a, p4, arrondis(a,p4));
        // Résultat : 0.666666686534882 => arrondis au 10000-ieme a 0.666670024394989
        //  a=-2./3. p4 = 10000
        printf("\n %.15f => arrondis au %d-ieme a %.4f", a, p4, arrondis(a,p4));
        // Résultat : -0.666666686534882 => arrondis au 10000-ieme a -0.6667
        printf("\n %.15f => arrondis au %d-ieme a %.15f", a, p4, arrondis(a,p4));
        // Résultat :  -0.666666686534882 => arrondis au 10000-ieme a -0.666660010814667
    En fait, l'arrondi tel qu'il est fait par la fonction a un comportement différent pour les nombres positifs et négatifs (arrondis(-x,...) != -arrondis(x,...)).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage nombres réels
    Par ingelman dans le forum WinDev
    Réponses: 3
    Dernier message: 18/01/2006, 15h28
  2. Affichage des nombres réels!
    Par smail21 dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/11/2005, 17h49
  3. Insertion d'un nombre réel dans une table
    Par mouloudéen dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/09/2005, 23h17
  4. Stockage d'un nombre réel
    Par vermo dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/04/2005, 15h01
  5. Stocker un nombre réel
    Par julson dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/04/2004, 08h59

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