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 :

conversion std::vector<double> en std::vector<float>


Sujet :

C++

  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    1 299
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 1 299
    Par d�faut conversion std::vector<double> en std::vector<float>
    Bonjour, j'ai des std::vector<double> que je dois convertir en std::vector<float> car j'appelle une fonction fortran qui utilise des floats.

    Mon code est le suivant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    std::vector<double> v1;
     
    // on suppose que v1 possède tous plein de valeurs
     
    std::vector<float> v2(v1.begin(), v1.edn())
    Et l� j'ai un warning du type "possible loss of data", ce qui se comprend. J'ai fait un

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    #pragma warning (disable : 4244)
    dans mon .cpp mais j'ai toujours le warning. Comment le supprimer ?

    Autre question : pourquoi si je fais

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    std::vector<double> v1;
     
    // on suppose que v1 possède tous plein de valeurs
     
    std::vector<float> v2 = v1;
    j'ai une erreur. Quelle est la diff�rence avec la 1e version ?

    Merci d'avance

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Malheureusement, le compilateur a raison: quand tu passe de double � float, tu risque de perdre des donn�es.

    La meilleure solution est donc... d'�viter ce genre de conversion, si tu ne veux pas avoir cet avertissement

    Si tu as bien conscience du fait que tu prend effectivement un risque, mais que tu sais parfaitement ce que tu fais en d�cidant de recourir � cette conversion parce qu'il t'est impossible de faire autrement, tu peux, simplement, d�cider de ne pas tenir compte de l'avertissement.

    Mais le mieux serait de voir s'il n'est pas possible d'utiliser soit une fonction �quivalente en fortran qui utilisera de double, soit de g�rer tes donn�es sous la forme de float en C++.

    A d�faut de plus de pr�cision, il nous sera malheureusement difficile de t'aider � faire le bon choix (m�me si, en r�gle g�n�rale, on peut consid�rer pr�f�rable d'essayer de garder les double )
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    Membre �prouv�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    1 299
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 1 299
    Par d�faut
    Salut,

    je comprends tout � fait qu'il vaille mieux garder mes doubles. Malheureusement, le prototype de la fonction fortran que j'appelle utilise des real*4 (donc des floats), et si je lui mets un double * �a ne marche pas, il faut que je lui mette un float * en argument... d'o� mon probl�me de conversion

  4. #4
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Dans ce cas, serait-il difficile de faire en sorte de g�rer... des float dans ton programme C++
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    1 299
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 1 299
    Par d�faut
    malheureusement oui...

    Tout mon programme utilise des doubles (plusieurs dizaines de milliers de lignes). J'ai juste besoin de cette fonction pour pre-traiter mes donn�es

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par salseropom Voir le message
    Tout mon programme utilise des doubles (plusieurs dizaines de milliers de lignes). J'ai juste besoin de cette fonction pour pre-traiter mes donn�es
    Pas de bol La seule technique valable � mon avis est de convertir les donn�es avec une boucle for classique.

  7. #7
    Membre �prouv�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    1 299
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 1 299
    Par d�faut
    oui, c'est ce que j'ai fait... c'est moche. Je voulais juste savoir s'il existait une m�thode plus rapide...

    Tant pis

    merci

  8. #8
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par salseropom Voir le message
    malheureusement oui...

    Tout mon programme utilise des doubles (plusieurs dizaines de milliers de lignes). J'ai juste besoin de cette fonction pour pre-traiter mes donn�es
    J'aurais presque alors envie de poser la question de savoir si l'utilisation de double dans ton programme C++ est justifi�e.

    Si, pour une raison ou une autre, tu n'a pas le choix d'utiliser des double dans ton programme C++, tu dois te dire que leur conversion en float aura de grandes chances de provoquer des d�sastres.

    Mais dans le cas inverse, pourquoi avoir choisi d'utiliser des double � la base
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    Si, pour une raison ou une autre, tu n'a pas le choix d'utiliser des double dans ton programme C++, tu dois te dire que leur conversion en float aura de grandes chances de provoquer des d�sastres.

    Mais dans le cas inverse, pourquoi avoir choisi d'utiliser des double � la base
    Vrai mais ce bon salseropom a sans doute r�cup�r� le travail de quelqu'un d'autre...

  10. #10
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Citation Envoy� par jblecanard Voir le message
    Pas de bol La seule technique valable � mon avis est de convertir les donn�es avec une boucle for classique.
    Je vois pas l'int�r�t avec la solution premi�re de salseropom qui est plus lisible et claire qu'une boucle for o� tu auras de toute fa�on une conversion :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    std::vector<double> v1;
     
    // on suppose que v1 possède tous plein de valeurs
     
    std::vector<float> v2(v1.begin(), v1.edn())
    Citation Envoy� par salseropom
    Quelle est la diff�rence avec la 1e version ?
    std::vector<float> vf(vd.begin(),vd.end()) appelle le constructeur de template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() ); dont la contrainte est que *InputIterator puisse �tre converti en float.

    std::vector<float> v2 = v1; : aucun constructeur n'existe :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    explicit vector ( const Allocator& = Allocator() );
    explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
    template <class InputIterator>
             vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
    vector ( const vector<T,Allocator>& x );
    Le seul qui semblerait correspondre pourrait �tre le dernier, le constructeur de copie. Mais ce ne peut pas �tre ce constructeur de copie car std::vector<float> et std::vector<double> sont 2 types diff�rents.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par 3DArchi Voir le message
    Je vois pas l'int�r�t avec la solution premi�re de salseropom qui est plus lisible et claire qu'une boucle for o� tu auras de toute fa�on une conversion :[code]std::vector<double> v1;
    Au temps pour moi, j'avais compris qu'il disait que �a ne fonctionnait pas

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. std::numeric_limits et double
    Par CliffeCSTL dans le forum D�buter
    R�ponses: 6
    Dernier message: 22/10/2014, 14h08
  2. std::vector semble ne pas utiliser std::move, pourquoi ?
    Par n0-sheep dans le forum SL & STL
    R�ponses: 7
    Dernier message: 15/03/2014, 01h25
  3. R�ponses: 4
    Dernier message: 04/06/2012, 15h19
  4. Convertir un std::string en double.
    Par vdumont dans le forum SL & STL
    R�ponses: 16
    Dernier message: 10/05/2006, 16h46
  5. Conversion 8 octets en double
    Par Invit� dans le forum VB 6 et ant�rieur
    R�ponses: 5
    Dernier message: 09/08/2004, 16h49

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