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 :

Problème d'arrondis de float


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut Problème d'arrondis de float
    Bonjour,

    En fait j'ai des valeurs issues de calculs flottants qui sont très proches mais tout de même différentes (car provenant du CPU d'une part et du GPU d'autre part).
    Ce que je souhaiterais, c'est trouver une manière d'arrondir au même entier des deux côtés et cela quelque soit le cas de figure, c'est à dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    1er cas:
        CPU : 40.0000000001
        GPU : 39.9999999999
        Même entier : 40
        Solution 1 : utiliser rintf()
    2eme cas:
        CPU : 171.4999999
        GPU : 171.5000000
        Même entier : 172
        Solution 2 : faire + 0.5 puis rintf()
    J'ai ensuite appliqué la solution 1 ou 2 en fonction de la partie décimal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if(part_decim > 0.0 && part-decim <= 0.5)
            Solution 2
        else
           Solution 1
    Malgré cela je n'arrive pas à m'en sortir, je tombe toujours dans un cas de figure on l'on arrondi pas au même entier des deux.

    Si quelqu'un connaît une méthode simple, ou peux corriger celle-ci.
    Merci de votre aide , en espérant avoir était claire.

  2. #2
    Membre émérite
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Par défaut
    Yop,

    as tu regardé floor et ceil ?
    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
    /* ceil example */
    #include <stdio.h>
    #include <math.h>
     
    int main ()
    {
      printf ("ceil of 2.3 is %.1lf\n", ceil (2.3) );
      printf ("ceil of 3.8 is %.1lf\n", ceil (3.8) );
      printf ("ceil of -2.3 is %.1lf\n", ceil (-2.3) );
      printf ("ceil of -3.8 is %.1lf\n", ceil (-3.8) );
      printf ("floor of 2.3 is %.1lf\n", floor (2.3) );
      printf ("floor of 3.8 is %.1lf\n", floor (3.8) );
      printf ("floor of -2.3 is %.1lf\n", floor (-2.3) );
      printf ("floor of -3.8 is %.1lf\n", floor (-3.8) );
     
      return 0;
    }
    cdlt,

    Fiki

  3. #3
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Oui je connais floor() et ceil() mais le problème est que ça ne résout pas tous les cas de figure.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        CPU : 30.999  ---> ceil()  --->  31
        GPU : 31.001  ---> floor() ---> 31
    Mais si le coup suivant on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        CPU : 32.5000 ---> ceil()  --->  33
        GPU : 32.4999 ---> floor() ---> 32

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Principe des arrondis en maths, >= 0.5 arrondi à la valeur du dessus, < 0.5 arrondi à la valeur du dessous.

    après ce que tu pourrait peut-être faire (je ne garanti pas que ce soit une solution valable), c'est faire la moyenne des nombres que u veux arrondir et arrondir cette moyenne pour ensuite l'assigner à chaque nombres

  5. #5
    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
    Ce que je souhaiterais, c'est trouver une manière d'arrondir au même entier des deux côtés et cela quelque soit le cas de figure, c'est à dire :....
    Le premier cas est non ambigu : tu veux arrondir à l'entier le plus proche pour les deux calculs.
    Le deuxième cas n'est pas clair : pourquoi décider d'avoir 172 ? L'entier le plus proche de CPU est 171. La seule raison d'utiliser 172 est liée à la valeur obtenue par le GPU (et d'ailleurs, on pourrait décider pour celui-ci d'avoir 171 comme pour le CPU).
    Autrement dit, ton critère doit tenir compte simultanément des deux valeurs obtenues. Il n'y a pas, à mon avis, de solutions qui s'appliqueraient indépendamment à chaque résultat pour donner le même entier à tout coups.

  6. #6
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Je vais poser le problème autrement :

    Soient C et G deux vecteurs de variables (float) tels que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pour tout i de 0 à 1000000 et epsilon=10^-3,  abs(Ci - Gi) < espilon
    Comment arrondir (de manière indépendante, sans pouvoir les comparer directement) C et G et obtenir le vecteur I d'entier sachant que dans certains cas Ci > Gi et d'autres cas Gi > Ci (à 10^-3 près).

    D'où l'exemple 2 où l'on arrondi au même entier pour que les résultats coïncident car dans cette exemple 171.5000 et 171.4999 sont différents (à cause de l'évaluation flottantes différentes sur CPU et GPU) mais c'est la même valeur, d'où l'arrondi "contre nature" de 171.4999 à 172 au lieu de 171.

Discussions similaires

  1. Problème d'arrondi
    Par rigobert dans le forum C
    Réponses: 28
    Dernier message: 05/04/2006, 12h56
  2. problème d'arrondi à 2 chiffres après virgule
    Par nerick dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2006, 17h26
  3. Problème d'arrondis
    Par steps5ive dans le forum Access
    Réponses: 5
    Dernier message: 09/12/2005, 17h35
  4. [DECIMAL] problème d'arrondi
    Par Boosters dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 28/11/2005, 15h30
  5. Problème d'arrondi
    Par ptitsoleil87 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/01/2005, 09h37

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