2016-11-03 4 views
2

나는 부스트 라이브러리를 사용하는 것이 처음이므로 도움이되는 모든 사람에게 감사했다.boost :: multiprecision :: number

#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; 

    } 

하지만 컴파일러 에러 아래와 같이 얻을 :

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

얻을 새로운 컴파일러 에러 :

[컴파일러 오류]

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)); 

제가 또한 위의 코드 변경

답변

1

비율 nals는 정의에 따라 정수 분자와 분모를가집니다.

부동 소수점을 정수로 변환하는 것은 정의 상 다시 무손실이 아닙니다. 컴파일러는 정적으로 인 변환을 컴파일 만합니다.

또한 변환이 연결되지 않습니다 (라이브러리가 모호한 변환 경로를 어떻게 해석합니까?). 이 경우 mpq_rational에 대한 기본 형식으로 변환하는 중간 단계 (즉 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"; 
} 

인쇄 귀하의 관심

8 
+0

감사하지만, 불행히도 나는 컴파일 얻을 오류 : 오류 : 정적 어설 션이 실패했습니다 : std :: numeric_limits :: is_specialized – Mary

+0

부스트 버전은 무엇입니까? 나는 그것을 테스트 부스트 1.62 – sehe

+0

부스트 버전 1_61_0 – Mary