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 :

arrondi du Resultat de division


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut arrondi du Resultat de division
    Bonjour,

    je souhaite stocker dans une variable de type entier la partie entiere du quotient de la division de 2 nombres de type double. Mais j'ai des problemes d'arrondi.

    Dans l'exemple ci-dessous, numerateur est sense contenir 0.6 mais il contient en fait 0.59999, denominateur est sensi contenir 0.2 mais contient 0.200001.

    Donc le "forcage de type (int)" me donne 2. La seule technique que j'ai trouvee consiste a utiliser ceil() et floor() mais il y a peut etre plus simple que ce if.

    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
    #include <stdio.h>
    #include <math.h>
     
    int main()
    {
    double numerateur, denominateur, N0;
    int q1, q2;
     
    	numerateur = 0.6;
    	denominateur = 0.2;
     
    	N0 = numerateur/denominateur;
     
    	q1 = (int)N0;		
    	if (N0 - floor(N0) <= 0.5)
    	{
    		q2 = floor(N0);
    	}
    	else
    	{
    		q2 = ceil(N0);
    	}
     
    	printf("N0 = num/denom = %.1f\n",N0);
    	printf("q1 = (int)N0 = %d\n",q1);
    	printf("q2 = (ceil or floor)N0 = %d\n",q2);
    	return 0;
    }
    Je vous remercie par avance pour vos suggestions.

    Lepapat

    PS : si j'initialise directement N0 a 3.0, pas de souci evidemment.

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    q1 = (int)(N0+.5);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut
    Hello,

    j'avais pense a cette idee mais quand j'ai par exemple :
    numerateur = 1.90
    denominateur = 0.4

    je souhaite q1 = 4

    mais avec ta technique j'obtiens (int)(4.75+0.5) = (int)(5.25) = 5 !

    LePapat

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut
    finalement je vais reprendre ta technique en ajoutant que 0.1. Ce qui est raisonnable par rapport a mes besoins fonctionnels.

    merci pour l'astuce.

    LePapat

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut
    Je te remercie pour ce lien.

    Ca me fait halluciner les impacts de ce stockage de nombre que l'on pense ne pas être parfait mais suffisemment précis pour ne pas provoquer d'effets de bord lors de comparaison de double.

    Je vais implémenter la fonction de comparaison avec le epsilon et j'ai enfin compris pourquoi mon moteur ne voulait jamais atteindre sa limite max : je comparais finalement 16.0000 avec 15.99999999 !

    LePapat

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Par défaut j'ai l'impression que tu es dans une impasse
    tu veux diviser 0.6/0.2 soit 3 reste 0
    mais tu veux aussi 0.006/0.002 soit 3 reste 0
    Et ainsi de suite.
    La divison réelle , n'admet pas de reste , c'est un approximation.

    En fait peut etre que les nombres que tu cheches sont 6/2 reste 0
    En gros ce que je dis ... Ton numerateur et ton denominateur sont des entiers...
    Alors ...fabrique des entiers..

Discussions similaires

  1. Arrondi et division suite à publipostage
    Par Wchef dans le forum Word
    Réponses: 2
    Dernier message: 06/03/2009, 09h56
  2. Division entière, arrondi au-dessous
    Par crosse9 dans le forum WinDev
    Réponses: 4
    Dernier message: 10/09/2007, 08h27
  3. arrondi apres division
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/08/2006, 16h33
  4. Division de 2 integer avec resultat dans un decimal
    Par Labienus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/03/2006, 12h46
  5. division des resultats de deux requetes
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 14/10/2005, 10h42

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