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 :

[Débutant] librairie mathématique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Par défaut [Débutant] librairie mathématique
    Bonjour,

    J'ai un problème qui me semble tout simple, mais je n'arrive pas à le résoudre... Je pense que vous pourrez m'aider!

    J'utilise C++ Builder 2007, et je n'arrive pas à faire une simple opération mathématique... En fait, les nombres rationnels ne sont pas pris en compte... Par exemple, pour faire simple, si je demande de calculer 1/2+1, le programme me renvoie 1, alors que si j'écris 0.5+1, le programme me renvoie bien 1.5...

    Je pense qu'il faut rajouter des librairies mathématiques, mais je ne sais pas lesquelles...
    J'ai rajouté un #include <math.h>, mais ça n'a rien résolu...

    Vous avez quelque chose à me proposer?

    Merci
    Joël

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Une opération entre entiers retourne des entiers, une opération entre doubles retourne des doubles. Une opération entre un entier et un double transforme l'entier en double, on applique la règle précédente.

    Remplace par exemple ton calcul par 1./2+1
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    tu pourrais poster ton code...histoire de voir un peu plus clair!

    vu de loin peut etre tu peux caster ton 1/2 en float...

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par loicounet Voir le message
    tu pourrais poster ton code...histoire de voir un peu plus clair!

    vu de loin peut etre tu peux caster ton 1/2 en float...
    Là, tu castes le résultat de l'opération (donc 0). Il faut caster soit l'une des opérandes, soit les deux, mais pas le résultat.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Par défaut
    ok merci beaucoup pour vos réponses.
    Ca m'aide beaucoup, et ça a résolu mon problème!

    par contre, j'aurai juste une dernière question, concernant le fait de caster une variable:

    Si jamais je déclare une variable en tant qu'integer, et que je la caste en float, est-ce qu'elle est considérée en tant que float pour tout le reste du code, ou est-ce que la variable est passée en float seulement là où je l'ai castée, et reste tout de même en integer ailleurs?

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tu crée localement une nouvelle données de type float. Ta variable est et reste un entier.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Par défaut
    ok c'est cool!
    Merci à tous!

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    C'est normal, lorsque tu ecris 1/2+1 tu travailles avec des entiers, le compilateur utilise donc les opérateurs entiers et la division entière de 1 par 2 revoie bien 0 et 0 + 1 renvoie alors 1. Lorsque tu ecris 0.5+1, tu travailles à la fois avec des entiers et des réels, dans ce cas, il faut tenir compte des règles de convertion de type. Dans ton cas, le 1 est converti en réel et on obtient alors 0.5+1.0 ce qui donne bien 1.5 L'informatique ne fonctionne pas exactement comme les maths, tu dois en avoir conscience notamment lorsque tu travailles avec des rationnels (en informatique, 1.0/3.0 + 1.0/3.0 + 1.0/3.0 != 1.0)

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par roro_la_patate Voir le message
    Bonjour,

    J'ai un problème qui me semble tout simple, mais je n'arrive pas à le résoudre... Je pense que vous pourrez m'aider!

    J'utilise C++ Builder 2007, et je n'arrive pas à faire une simple opération mathématique... En fait, les nombres rationnels ne sont pas pris en compte... Par exemple, pour faire simple, si je demande de calculer 1/2+1, le programme me renvoie 1, alors que si j'écris 0.5+1, le programme me renvoie bien 1.5...

    Je pense qu'il faut rajouter des librairies mathématiques, mais je ne sais pas lesquelles...
    J'ai rajouté un #include <math.h>, mais ça n'a rien résolu...

    Vous avez quelque chose à me proposer?

    Merci
    Joël
    Non, le problème est que l'expression mathématique que tu écrit n'est pas (vu du compilateur) la somme de deux nombres rationnels, mais deux opérations distinctes:
    1) la division entière de 1 par 2 (et comme il y a 0 fois 2 dans 1, tu obtiens 0)
    2) l'addition de 1 au résultat de l'opération précédente.
    Donc tu obtiens 1 au final.

    Il faut comprendre comment fonctionne un microprocesseur: il exécute les opérations en séquence, en se basant sur les informations que tu lui donnes. En C ou en C++, diviser un entier par un autre provoque l'appel des fonctions de division entière - donc 1/2+1 = 1. Mais dès lors que tu travailles avec des nombres flottants, le coprocesseur arithmétique est utilisé - le résultat est alors calculé avec les valeurs flottantes (donc 0.5+1 = environ 1.5).

    J'ai bien dit environ. En effet, l'encodage d'un nombre flottant utilise un nombre fini de bits, et suit une règle bien particulière. A cause de cette règle, certains nombres flottants simple ne peuvent pas être représentés. De même, certaines opérations ne peuvent être exécutée avec précision (exemple: 10^100 + 1 = 10^100). Cela provoque des problèmes qui sont quelques fois ardus. Par exemple, tous les entiers ne pouvant être représentés, la fonction suivante n'a aucune chance de renvoyer true dès lors que n est suffisamment grand.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    bool f(int n)
    {
      float f1 = 0.0f, f2;
      for (int i=0; i<n; ++i)
      {
        f1 += 0.1f;
        f1 += 0.2f;
        f1 += 0.3f;
        f1 += 0.4f;
      }
      f2 = (float)n;
      if (f1 != f2) return false;
      else return true;
    }
    Si tu veux avoir accès à des fonctions mathématiques un peu plus évoluées, il te faudra passer par des librairies externes. Blitz++ me vient à l'esprit, mais il y en a certainement d'autres (d'autant plus que celle-ci est un peu complexe à utiliser, et se concentre plus sur le calcul matriciel).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. Librairies mathématiques compilées?
    Par bigen007_ch dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 06/02/2009, 13h55
  2. Librairie mathématique avancée
    Par decondelite dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/11/2008, 09h46
  3. [CLisp][Débutant] Librairie de chronométrage
    Par lunart dans le forum Lisp
    Réponses: 5
    Dernier message: 06/02/2007, 00h31
  4. [débutant] librairie shellapi.h
    Par alex'l dans le forum MFC
    Réponses: 2
    Dernier message: 07/11/2005, 17h14

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