Search code examples
c++boostboost-multiprecision

boost::multiprecision::number


I'm new in using boost library, so I thanked every one that helps me.

#include "gmpxx.h"
#include <boost/multiprecision/gmp.hpp>
#include <boost/multiprecision/random.hpp>
#include <boost/multiprecision/number.hpp>

using namespace std;
using namespace boost::multiprecision;
using boost::multiprecision::mpz_int;
using boost::multiprecision::mpq_rational;
using boost::multiprecision::uint128_t;
using boost::multiprecision::uint256_t;
using boost::multiprecision::uint512_t;
using boost::multiprecision::uint1024_t;
using boost::multiprecision::mpf_float;

 void testtmultiprecisions(){
     mpq_rational b = boost::multiprecision::pow(mpf_float(1), mpf_float(2));
     std::cout << typeid(b).name() << std::endl;

  }

but i get compiler error like below :

 error: conversion from boost::enable_if_c<true,   
  boost::multiprecision::detail::expression
  <boost::multiprecision::detail::function, 
  boost::multiprecision::detail::pow_funct
  <boost::multiprecision::backends::gmp_float<0u> >, 
  boost::multiprecision::number
  <boost::multiprecision::backends::gmp_float<0u> >, 
  boost::multiprecision::number
  <boost::multiprecision::backends::gmp_float<0u> >, void> 
  >::type {aka boost::multiprecision::detail::expression
  <boost::multiprecision::detail::function, 
  boost::multiprecision::detail::pow_funct
  <boost::multiprecision::backends::gmp_float<0u> >, 
  boost::multiprecision::number
  <boost::multiprecision::backends::gmp_float<0u> >, 
  <boost::multiprecision::backends::gmp_float<0u> >, void>}
  to non-scalar type â€کboost::multiprecision::mpq_rational {aka 
  boost::multiprecision::number
  <boost::multiprecision::backends::gmp_rational, 
  (boost::multiprecision::expression_template_option)1u>}
   requested
  mpq_rational b = boost::multiprecision::pow(mpf_float(1), mpf_float(2));

i also changed above code :

  mpq_rational b = boost::multiprecision::pow(mpf_float(1),
  mpf_float(2)).covert_to<mpq_rational>();

and get new compiler errors :

[compiler error]


Solution

  • Rationals, by definition, have integral numerator and denominator.

    Conversion of floating point to integral numbers is - again by definition - not lossless. The compiler will only compile conversions that are statically known to be lossless.

    Also, conversions will not be chained (how would the library resolve ambiguous conversion paths?). In this case, you could help the compiler out using the intermediate step converting to the underlying type for mpq_rational (namely mpz_int):

    #include <boost/multiprecision/gmp.hpp>
    #include <boost/multiprecision/number.hpp>
    #include <iostream>
    
    using boost::multiprecision::mpq_rational;
    using boost::multiprecision::mpz_int;
    using boost::multiprecision::mpf_float;
    
    int main() {
        mpq_rational b = boost::multiprecision::pow(mpf_float(2), mpf_float(3)).convert_to<mpz_int>();
        std::cout << b << "\n";
    }
    

    Prints

    8