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 :

Arrondir un double


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 53
    Par défaut Arrondir un double
    Plop,
    J'essaie actuellement de faire une chtite fonction me permettant d'afficher des nombres flottants a l'ecran. N'ayant pas le droit d'utiliser les bibliotheques standards (epitech), j'ai essaye de me contenter des castages, mais a priori, ca ne marche point. Et c'est chiant.

    Voila donc mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void	my_put_double(double nbr, int precision)
    {
      int	temp;
     
      temp = nbr;
      my_put_nbr(nbr);
      my_putchar('.');
      temp = (nbr - temp) * my_power_rec(10, precision);
      my_put_nbr(temp);
    }
    La raison de la presenced'une variable temporaire, c'est qu'en utilisant les castages purs, je me retrouve avec des erreurs encore plus grosses (au lieu que seule la partie decimale soit erronee, c'est aussi la partie entiere qui se met a deconner).

    Est-ce que vous auriez une idee sur ce qui pourrait eventuellement faire clamser ce bout de code tout con ?

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Sans savoir ce que font my_put_nbr, my_power_rec ni ce qu'est censée faire exactement my_put_double (= ce que tu VOUDRAIS qu'elle fasse, en fonction de ses arguments), ça ne va pas être simple...

    Mathématiquement parlant, arrondir à 10^-n correspond à multiplier ton nombre par 10^n, à en prendre la partie entière (ou l'arrondi entier), puis à le diviser par 10^n pour obtenir le résultat. Bien sûr, tu as de gros risques d'erreurs de calcul dû aux limites des représentations en virgule flottante, mais je me vois mal te conseiller de torpiller directement la mantisse et l'exposant de ton double au niveau binaire...

    La formule que je vois dans ton code ne ressemble pas franchement à ça, en tout cas.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 53
    Par défaut
    my_put_nbr = afficher un nombre entier X sur la sortie standard.
    my_power_rec = mettre un nombre X a la puissance Y

    my_put_double est cense faire comme my_put_nbr, mais avec des doubles (en permettant ainsi d'afficher les Y chiffres apres la virgule). Donc il ne renvoit pas un nombre arrondi, il l'affiche. Le titre du topic n'est pas tres clair a ce sujet =/

    A l'origine, c'est en vue d'afficher le resultat d'une racine carree.

    J'ai bien pense a essayer de modifier les composants du float, mais bon ... pas vraiment le niveau pour ca x)
    Par ailleurs, je ne comprends pas pourquoi mon code ne marche pas, donc autant le savoir avant de passer a des choses plus compliquees

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    A premiere vu, cela devrait fonctionner.

    Reste a voir :

    * s'il n'y a pas perte de donné lors de la conversion double -> int
    * Si les fonction que tu as coder sont juste

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    OK, je vois mieux.

    Essaie ça (j'ai volontairement décomposé les opérations et mis en bleu/gras les modifs) :
    Code C : 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
    void	my_put_double(double nbr, int precision)
    {
      int	temp;
      double real_part ;
      double frac_part ;
     
      temp = (int)nbr;
      real_part = temp ;
      /* Passer explicitement un entier en étant sûr que ce ne sera pas un double casté bovinement */
      my_put_nbr(temp);
      my_putchar('.');
      /* Pas d'entiers mêlés au calcul récupérant la partie fractionnaire. */
      frac_part = (nbr - real_part) * my_power_rec(10, precision);
      temp = (int)frac_part ;
      /* Passer explicitement un entier en étant sûr que ce ne sera pas un double casté bovinement */
      my_put_nbr(temp);
    }
    Après, via les bons casts, tu peux te passer de real_part et frac_part, bien entendu.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 53
    Par défaut
    Merci mais non, les memes problemes sont present.
    Et ca ne vient pas de ma fonction d'affichage d'entier : un printf sur temp affiche egalement un resultat errone (la partie entiere a ete fausse une fois, d'ailleurs).

    J'ai utilise gcc 3.4.2 pour compiler.

    Zarb comme soucis quand meme ^^'

  7. #7
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Quelles est le nombre que tu souhaite convertir ?

    Il y a peut etre depassement de type int.

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    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
    void my_put_double ( double nbr, int precision ) {
     
      int temp;
      double real_part ;
      double frac_part ;
     
      temp = (int)nbr;
      real_part = temp ;
      /* Passer explicitement un entier en étant sûr que ce ne sera pas un double casté bovinement */
      printf("%d",temp);
      printf(".");
      /* Pas d'entiers mêlés au calcul récupérant la partie fractionnaire. */
      frac_part = (nbr - real_part) * pow((double)10.0, precision);
      temp = (int)frac_part ;
      /* Passer explicitement un entier en étant sûr que ce ne sera pas un double casté bovinement */
      printf("%d\n",temp);
    }
    Fonctionne nickel sur Visual Studio 2008... La "grosse" différence, c'est le pow et l'affichage...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Arrondir un Double
    Par SpeedOverflow dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 31/08/2011, 20h45
  2. Arrondir un double
    Par kheira dans le forum C++Builder
    Réponses: 11
    Dernier message: 20/04/2010, 13h35
  3. arrondir un double
    Par mkachakh dans le forum Général Java
    Réponses: 1
    Dernier message: 27/02/2008, 12h08
  4. Comment arrondir un Double à l'excès ?
    Par vitch8 dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2008, 10h39
  5. arrondir reel double MSHFLEXGRID
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 27/09/2006, 16h27

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