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

Boost C++ Discussion :

Coupler Boost::rational à GMP


Sujet :

Boost C++

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut Coupler Boost::rational à GMP
    Bonjour,

    Je cherche à coupler l'utilisation de la bibliothèque rational de Boost au type d'entier à précision arbitraire qu'implémente la bibliothèque GMP.

    J'ai vu que Boost à un binding particulier pour rendre les types de GMP et MPFR compatibles avec les bibliothèques de Boost (voir using Boost with MPFR/GMP).

    Néanmoins, l'ECM suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <boost/math/bindings/mpfr.hpp>
    #include <boost/rational.hpp>
     
    typedef boost::rational<mpz_class> rat;
     
    int main(void) {
      rat r;
     
      return 0;
    }
    produit :
    $ g++ try.cpp -lgmp -lmpfr -lgmpfrxx -lm
    In file included from try.cpp:2:0:
    /usr/include/boost/rational.hpp: In instantiation of ‘boost::rational<__gmp_expr<__mpz_struct [1], __mpz_struct [1]> >’:
    try.cpp:7:7: instantiated from here
    /usr/include/boost/rational.hpp:127:1: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’
    Ce que je comprends comme le fait que Boost me tape sur les doigts car je n'utilise pas rational comme il faut. Donc que le type mpz_class (ou mpfr_class qui me donne la même erreur) ne satisfait pas les pré-requis du type abstrait de l'implémentation de boost::rational.
    Si c'est cela, le binding (premier include) n'est-il pas censé y pourvoir ?

    En vous remerciant.

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    L'assertion ets liée a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BOOST_STATIC_ASSERT( ::std::numeric_limits<IntType>::is_specialized );
    je ne pense pas que le binding GMP surcharge proprement numeric_limits.

  3. #3
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Non le binding n'est que pour les concepts de boost.math. En l'occurence ici ce qui péte c'est que y'a pas de spécialisation de numeric_limits pour mpz_class.


    edit : haha, toujours trop lent.

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut
    Et donc, comment y remédier proprement ?

    Ou bien, si ce n'est pas possible, quelle bibliothèque d'entiers à précision arbitraire est compatible avec Boost ?

    EDIT : j'ai procédé comme suit
    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
    #include <boost/math/bindings/mpfr.hpp>
    #include <boost/rational.hpp>
     
    namespace std { // std : specialization
      template <> class numeric_limits<mpz_class> {
      public:
        static const bool is_specialized = true;
        // Tous le reste de la classe numeric_limits avec 'T'
        // remplacé par 'mpz_class'
      };
    } // namespace std
     
    typedef boost::rational<mpz_class> rat;
     
    int main(void) {
      mpz_class num("17"), den("29");
      rat r(num, den);
      std::cout << r.numerator().get_str() << "/"
    	    << r.denominator().get_str() << "\n";
     
      return 0;
    }
    Il y a-t-il un moyen de ne pas avoir à recopier toute la classe ? J'ai bien pensé à l'héritage en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class BigInt : public mpz_class {
    public:
      // Quelques constructeurs
    };
     
    namespace std { // std : specialization
      template <> class numeric_limits<BigInt>
        : public numeric_limits<mpz_class> {
      public:
        static const bool is_specialized = true;
      };
    } // namespace std
    Mais alors, le compilo' me trouve plein de petits soucis avec les constructeurs. Pis bon, le principe d'utiliser une bibliothèque, c'est de pouvoir utiliser sa puissance sans mettre les mains dans le camboui. Alors, là, si c'est pour se retaper les constructeurs...

    (En utilisant la méthode de la redéfinition complète, je tombe sur un problème de linkage : voir ce topic)

Discussions similaires

  1. IBM rachète Rational
    Par Marc Lussac dans le forum Actualités
    Réponses: 27
    Dernier message: 18/07/2007, 17h51
  2. Comment installer GMP sous Windows?
    Par Vinchol dans le forum Autres éditeurs
    Réponses: 9
    Dernier message: 13/07/2006, 10h05
  3. installation de boost
    Par heinquoi dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 18/04/2005, 17h20
  4. Installation de boost (librairie)
    Par dj.motte dans le forum Autres éditeurs
    Réponses: 14
    Dernier message: 21/11/2004, 03h11
  5. cherchecomment utiliser boost sous linux
    Par Krost dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 25/02/2004, 22h03

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