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 :

Impossible de calculer arcsinus en multiprécision


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par défaut Impossible de calculer arcsinus en multiprécision
    Bonjour à tous,

    Je travaille avec la bibliothèque de multiprecision "boost".

    Pas de problème pour calculer les sinus et cosinus avec cette bibliothèque .
    Par contre, impossible de calculer les arcsinus et les arcosinus avec cette même bibliothèque.

    Merci pour votre aide.

    Marc75
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #include <boost/multiprecision/cpp_dec_float.hpp>
    #include <boost/math/constants/constants.hpp>
    #include <iostream>
    #include <limits>
    #include <vector>
    #include <algorithm>
    #include <iomanip>
    #include <iterator>
    #include <fstream>
    #include <string>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <sys/time.h>
    #include <unistd.h>
    using namespace std;
     
    // --------------------------------------------------------------------
     
    int main()
    {
     
    	using boost::multiprecision::cpp_dec_float_50;
     
    	using boost::math::constants::pi;
    	cpp_dec_float_50 p = pi<cpp_dec_float_50>();
     
     
    	int SET_PREC = 50;
     
     
     
    	cpp_dec_float_50 R = cpp_dec_float_50("1.0");
    	cpp_dec_float_50 C = cpp_dec_float_50("3.0");
     
     
    	cpp_dec_float_50 angle = cpp_dec_float_50(R/C);
     
    	cpp_dec_float_50 resu = cpp_dec_float_50(asin(angle*p/180));
     
     
    	std::cout << std::setprecision(SET_PREC)  
    	<< std::fixed 
    	<< std::showpos 
    	<< resu <<  " " 
    	<< std::endl;
     
    }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Par défaut
    Bonjour,

    On ne le dira jamais assez, évitez le using namespace std.
    Sinon quelle erreur obtenez vous avec ce code?

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par défaut
    Bonjour,

    Merci pour le conseil sur "using namespace std;".
    J'obtiens le message (plutôt long) suivant :

    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
    In file included from /usr/local/include/boost/type_traits/make_unsigned.hpp:26:0,
                     from /usr/local/include/boost/multiprecision/number.hpp:20,
                     from /usr/local/include/boost/multiprecision/cpp_dec_float.hpp:28,
                     from prog_cosinus_3.cpp:1:
    /usr/local/include/boost/math/tools/promotion.hpp: Dans l'instanciation de «*struct boost::m                ath::tools::promote_args<long double, float, float, float, float, float>*»*:
    /usr/local/include/boost/math/special_functions/sign.hpp:124:59:   requis par la substitutio                n de «*template<class T> typename boost::math::tools::promote_args<T>::type boost::math::cha                ngesign(const T&) [with T = long double]*»
    /usr/local/include/boost/lexical_cast.hpp:1031:56:   requis par «*bool boost::detail::parse_                inf_nan_impl(const CharT*, const CharT*, T&, const CharT*, const CharT*, const CharT*, const                 CharT*, CharT, CharT) [with CharT = char; T = long double]*»
    /usr/local/include/boost/lexical_cast.hpp:1143:38:   requis par «*bool boost::detail::parse_                inf_nan(const CharT*, const CharT*, T&) [with CharT = char; T = long double]*»
    /usr/local/include/boost/lexical_cast.hpp:2162:34:   requis par «*bool boost::detail::lexica                l_stream_limited_src<CharT, Traits, RequiresStringbuffer>::float_types_converter_internal(T&                , int) [with T = long double; CharT = char; Traits = std::char_traits<char>; bool RequiresSt                ringbuffer = false]*»
    /usr/local/include/boost/lexical_cast.hpp:2217:54:   requis par «*bool boost::detail::lexica                l_stream_limited_src<CharT, Traits, RequiresStringbuffer>::operator>>(long double&) [with Ch                arT = char; Traits = std::char_traits<char>; bool RequiresStringbuffer = false]*»
    /usr/local/include/boost/lexical_cast.hpp:2350:51:   [ passe outre 8 contextes d'instanciati                on, utilisez -ftemplate-backtrace-limit=0 pour désactiver ]
    /usr/local/include/boost/multiprecision/number.hpp:1169:8:   requis par «*void boost::multip                recision::number<Backend, ExpressionTemplates>::do_assign_function_1(const F&, const Exp&, c                onst Tag&) [with F = boost::multiprecision::detail::acos_funct<boost::multiprecision::backen                ds::cpp_dec_float<50u> >; Exp = boost::multiprecision::detail::expression<boost::multiprecis                ion::detail::divides, boost::multiprecision::detail::expression<boost::multiprecision::detai                l::multiply_immediates, boost::multiprecision::number<boost::multiprecision::backends::cpp_d                ec_float<50u> >, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_floa                t<50u> >, void, void>, int, void, void>; Tag = boost::multiprecision::detail::divides; Backe                nd = boost::multiprecision::backends::cpp_dec_float<50u>; boost::multiprecision::expression_                template_option ExpressionTemplates = (boost::multiprecision::expression_template_option)1u                 *»
    /usr/local/include/boost/multiprecision/number.hpp:1158:7:   requis par «*void boost::multip                recision::number<Backend, ExpressionTemplates>::do_assign_function(const Exp&, const mpl_::i                nt_<2>&) [with Exp = boost::multiprecision::detail::expression<boost::multiprecision::detail                ::function, boost::multiprecision::detail::acos_funct<boost::multiprecision::backends::cpp_d                ec_float<50u> >, boost::multiprecision::detail::expression<boost::multiprecision::detail::di                vides, boost::multiprecision::detail::expression<boost::multiprecision::detail::multiply_imm                ediates, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u> >                , boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u> >, void,                 void>, int, void, void>, void, void>; Backend = boost::multiprecision::backends::cpp_dec_fl                oat<50u>; boost::multiprecision::expression_template_option ExpressionTemplates = (boost::mu                ltiprecision::expression_template_option)1u]*»
    /usr/local/include/boost/multiprecision/number.hpp:1063:7:   requis par «*void boost::multip                recision::number<Backend, ExpressionTemplates>::do_assign(const Exp&, const boost::multiprec                ision::detail::function&) [with Exp = boost::multiprecision::detail::expression<boost::multi                precision::detail::function, boost::multiprecision::detail::acos_funct<boost::multiprecision                ::backends::cpp_dec_float<50u> >, boost::multiprecision::detail::expression<boost::multiprec                ision::detail::divides, boost::multiprecision::detail::expression<boost::multiprecision::det                ail::multiply_immediates, boost::multiprecision::number<boost::multiprecision::backends::cpp                _dec_float<50u> >, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_fl                oat<50u> >, void, void>, int, void, void>, void, void>; Backend = boost::multiprecision::bac                kends::cpp_dec_float<50u>; boost::multiprecision::expression_template_option ExpressionTempl                ates = (boost::multiprecision::expression_template_option)1u]*»
    /usr/local/include/boost/multiprecision/number.hpp:680:7:   requis par «*void boost::multipr                ecision::number<Backend, ExpressionTemplates>::do_assign(const boost::multiprecision::detail                ::expression<tag, Arg1, Arg2, Arg3, Arg4>&, const true_&) [with tag = boost::multiprecision:                :detail::function; Arg1 = boost::multiprecision::detail::acos_funct<boost::multiprecision::b                ackends::cpp_dec_float<50u> >; Arg2 = boost::multiprecision::detail::expression<boost::multi                precision::detail::divides, boost::multiprecision::detail::expression<boost::multiprecision:                :detail::multiply_immediates, boost::multiprecision::number<boost::multiprecision::backends:                :cpp_dec_float<50u> >, boost::multiprecision::number<boost::multiprecision::backends::cpp_de                c_float<50u> >, void, void>, int, void, void>; Arg3 = void; Arg4 = void; Backend = boost::mu                ltiprecision::backends::cpp_dec_float<50u>; boost::multiprecision::expression_template_optio                n ExpressionTemplates = (boost::multiprecision::expression_template_option)1u; mpl_::true_ =                 mpl_::bool_<true>]*»
    /usr/local/include/boost/multiprecision/number.hpp:134:7:   requis par «*typename boost::ena                ble_if<boost::is_convertible<typename boost::multiprecision::detail::expression<tag, Arg1, A                rg2, Arg3, Arg4>::result_type, boost::multiprecision::number<Backend, ExpressionTemplates> >                , boost::multiprecision::number<Backend, ExpressionTemplates>&>::type boost::multiprecision:                :number<Backend, ExpressionTemplates>::operator=(const boost::multiprecision::detail::expres                sion<tag, Arg1, Arg2, Arg3, Arg4>&) [with tag = boost::multiprecision::detail::function; Arg                1 = boost::multiprecision::detail::acos_funct<boost::multiprecision::backends::cpp_dec_float                <50u> >; Arg2 = boost::multiprecision::detail::expression<boost::multiprecision::detail::div                ides, boost::multiprecision::detail::expression<boost::multiprecision::detail::multiply_imme                diates, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u> >,                 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u> >, void,                 void>, int, void, void>; Arg3 = void; Arg4 = void; Backend = boost::multiprecision::backends                ::cpp_dec_float<50u>; boost::multiprecision::expression_template_option ExpressionTemplates                 = (boost::multiprecision::expression_template_option)1u; typename boost::enable_if<boost::is                _convertible<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>                ::result_type, boost::multiprecision::number<Backend, ExpressionTemplates> >, boost::multipr                ecision::number<Backend, ExpressionTemplates>&>::type = boost::multiprecision::number<boost:                :multiprecision::backends::cpp_dec_float<50u> >&]*»
    /usr/local/include/boost/multiprecision/number.hpp:181:13:   requis par «*boost::multiprecis                ion::number<Backend, ExpressionTemplates>::number(const boost::multiprecision::detail::expre                ssion<tag, Arg1, Arg2, Arg3, Arg4>&, typename boost::enable_if_c<boost::is_convertible<typen                ame boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, boo                st::multiprecision::number<Backend, ExpressionTemplates> >::value>::type*) [with tag = boost                ::multiprecision::detail::function; Arg1 = boost::multiprecision::detail::acos_funct<boost::                multiprecision::backends::cpp_dec_float<50u> >; Arg2 = boost::multiprecision::detail::expres                sion<boost::multiprecision::detail::divides, boost::multiprecision::detail::expression<boost                ::multiprecision::detail::multiply_immediates, boost::multiprecision::number<boost::multipre                cision::backends::cpp_dec_float<50u> >, boost::multiprecision::number<boost::multiprecision:                :backends::cpp_dec_float<50u> >, void, void>, int, void, void>; Arg3 = void; Arg4 = void; Ba                ckend = boost::multiprecision::backends::cpp_dec_float<50u>; boost::multiprecision::expressi                on_template_option ExpressionTemplates = (boost::multiprecision::expression_template_option)                1u; typename boost::enable_if_c<boost::is_convertible<typename boost::multiprecision::detail                ::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, boost::multiprecision::number<Backen                d, ExpressionTemplates> >::value>::type = void]*»
    prog_cosinus_3.cpp:39:60:   requis depuis ici
    /usr/local/include/boost/math/tools/promotion.hpp:141:10: erreur*: static assertion failed:                 (0 == ::boost::is_same<type, long double>::value)
              BOOST_STATIC_ASSERT((0 == ::boost::is_same<type, long double>::value));
              ^
    Alors que le même code avec sin au lieu de asin fonctionne parfaitement ...

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Sur Wandbox (https://wandbox.org/), ça fonctionne avec la commande suivante g++ prog.cc -Wall -Wextra -I/opt/wandbox/boost-1.67.0/gcc-head/include -std=c++17.

    Il faudrait en dire plus sur ton environnement : version de Boost, nom et version du compilateur, version de C++, etc.

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par défaut
    Bonjour,
    Mon programme a comme extension cpp comme c'est en c++.
    Je compile avec les options suivantes : g++ -std=c++11 -o prog.exe prog.cpp

    La version de boost utilisée est 1.54.0
    La version du compilateur g++ : g++ (GCC) 6.4.0

    J'ai essayé avec vos options sans succès.

    Merci.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Que se trouve en prog_cosinus_3.cpp [ligne] 39 ([caractère] 60) ?
    L'erreur semble indiquer que tu utilises des long double alors qu'il attend autre chose, en fait tout sauf ça : BOOST_STATIC_ASSERT((0 == ::boost::is_same<type, long double>::value));
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Par défaut
    Sur ma debian boost 1.62, g++ 6.3 ça marche aussi...
    -peut être votre boost est un peu ancien, et que les versions plus récentes acceptent les long double..-

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

Discussions similaires

  1. [AC-2003] Impossible de calculer une somme
    Par Hugo_35700 dans le forum IHM
    Réponses: 9
    Dernier message: 04/03/2013, 14h45
  2. Réponses: 3
    Dernier message: 01/07/2009, 17h38
  3. Réponses: 2
    Dernier message: 30/05/2008, 09h39
  4. Calcul des stats impossible
    Par Mehdilis dans le forum Oracle
    Réponses: 1
    Dernier message: 07/01/2008, 18h30
  5. Réponses: 10
    Dernier message: 21/11/2005, 23h05

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