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

Langage C++ Discussion :

Problème cast d'un int en double pour utiliser la fonction sin()


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 116
    Points : 44
    Points
    44
    Par défaut Problème cast d'un int en double pour utiliser la fonction sin()
    Bonjour à tous,

    J'ai besoin d'utiliser la fonction sin() dans un projet à partir de nombres entiers.
    Comme la fonction sin() de math.h ne prend que des double, long double ou float en paramètre, je fais un cast de mes int en double.

    Or, quand je compare le résultat que j’obtiens avec celui d'une calculatrice, il est faux.

    Est-ce que quelqu'un pourrait me dire d'où cela provient-il et s'il existe une solution ?

    Merci par avance.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par Zaza91280 Voir le message
    Bonjour à tous,

    J'ai besoin d'utiliser la fonction sin() dans un projet à partir de nombres entiers.
    Comme la fonction sin() de math.h ne prend que des double, long double ou float en paramètre, je fais un cast de mes int en double.

    Or, quand je compare le résultat que j’obtiens avec celui d'une calculatrice, il est faux.

    Est-ce que quelqu'un pourrait me dire d'où cela provient-il et s'il existe une solution ?

    Merci par avance.
    avec un exemple concret, oui, on pourrait surement t'aider

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 396
    Points : 23 759
    Points
    23 759
    Par défaut
    Bonjour,

    Citation Envoyé par Zaza91280 Voir le message
    J'ai besoin d'utiliser la fonction sin() dans un projet à partir de nombres entiers. Comme la fonction sin() de math.h ne prend que des double, long double ou float en paramètre, je fais un cast de mes int en double.
    Il faut savoir que les float, les double et les int ne sont que des suites de 32 ou 64 bits et qu'à nombre de bits égal, le nombre de valeurs différentes que tu peux représenter est le même. Ça veut dire que ce que tu gagnes d'un côté, tu le perds d'un autre.

    Par contre, j'ai du mal à voir comment tu peux exploiter efficacement la fonction sin avec des entiers. Est-ce que, par hasard, tu n'utiliserais pas des degrés au lieu des radians ? Si c'est le cas, convertis tes valeurs en double puis divise-les par 57,295779513 (soit 360 ÷ 2π ).

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 116
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,



    Il faut savoir que les float, les double et les int ne sont que des suites de 32 ou 64 bits et qu'à nombre de bits égal, le nombre de valeurs différentes que tu peux représenter est le même. Ça veut dire que ce que tu gagnes d'un côté, tu le perds d'un autre.

    Par contre, j'ai du mal à voir comment tu peux exploiter efficacement la fonction sin avec des entiers. Est-ce que, par hasard, tu n'utiliserais pas des degrés au lieu des radians ? Si c'est le cas, convertis tes valeurs en double puis divise-les par 57,295779513 (soit 360 ÷ 2π ).
    Je travaille bien en radian, j'ai vérifié.

    Voici le bout de code que j'utilise pour mon cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c->addEltPile(new Constante(QString::number(sin(*(double*)first->getFirstMember())).replace('.',',')));
    Par exemple quand je calcule le sin du nombre 9 (originellement un int) j'obtiens -0,... au lieu de 0,412.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 396
    Points : 23 759
    Points
    23 759
    Par défaut
    Bonjour,

    Montre-nous ton code en entier s'il-te-plaît.

    Comment peux-tu travailler en radians avec des entiers (même si c'est pour les convertir au moment d'appeler la fonction) ? Un tour complet couvre l'intervalle [0:2π] (ou [-π;+π]). Ça veut dire que tu ne pourrais coder que les angles de valeur 0,00, 1,00, 2,00, 3,00, 4,00, 5,00 ou 6,00, soit seulement sept positions sur ton cercle, à moins de dépasser l'intervalle et de jouer sur la congruence de la fonction.

  6. #6
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    Pour changer le type d'une variable, utilises le cast C++

    Et non la version C

    Ici tu auras un peu d'infos ^^

    http://cpp.developpez.com/faq/cpp/?page=conversions

  7. #7
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 765
    Points
    765
    Par défaut
    DakM a raison, il vaut mieux utiliser le casts "à la C++" : static_cast, reinterpret_cast, ...

    Dans ton cas, ta manipulation converti un pointeur vers un entier en un pointeur vers un double. Quand tu dé-références celui-ci, le programme interprète la valeur pointée, qui est un entier, comme un double (tu fais l'équivalent du reinterpret_cast). Or ce n'est pas ce que tu veux : tu veux convertir ton entier en double. Il faut que tu dé-références ton pointeur, puis ensuite que tu convertisse la valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c->addEltPile(new Constante(QString::number(sin((double)*first->getFirstMember())).replace('.',',')));
    Comme on te l'as dit, c'est un cast "à la C". Tu n'aurais pas eu de problème si tu avais utilisé les casts "à la C++" puisque le compilateur t'aurais prévenu que tu essayes de convertir un pointeur en un pointeur vers un autre type qui n'est pas compatible.

    En effet, ça compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c->addEltPile(new Constante(QString::number(sin(static_cast<double>(*first->getFirstMember()))).replace('.',',')));
    mais ça non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c->addEltPile(new Constante(QString::number(sin(*static_cast<double*>(first->getFirstMember()))).replace('.',',')));

Discussions similaires

  1. Problème pour utiliser ma fonction
    Par nicosmash dans le forum Langage
    Réponses: 5
    Dernier message: 02/11/2012, 22h09
  2. Réponses: 0
    Dernier message: 17/06/2010, 14h22
  3. [Débutant] Emplacement dossier pour utiliser des fonctions créées
    Par PlapPlop dans le forum Images
    Réponses: 1
    Dernier message: 31/05/2010, 20h33
  4. Aide pour utiliser une fonction dans un "case"
    Par lcoulon dans le forum Débuter
    Réponses: 2
    Dernier message: 15/10/2009, 22h17
  5. probleme pour utiliser les fonctions
    Par julius0123 dans le forum ASP
    Réponses: 3
    Dernier message: 02/07/2009, 13h49

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