2016-11-03 3 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; 

    } 

しかし、私は以下のようなコンパイルエラーを取得:

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

私はまた、上記のコード変更:

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

と新しいコンパイラのエラーを取得:

[コンパイルエラー]

答えて

1

比率定義上、整数は分子と分母が整数である。

浮動小数点を整数に変換することは、やはり定義上 - 無損失ではありません。コンパイラは、という静的な変換をコンパイルするだけです。はロスレスであることがわかります。

また、変換は連鎖されません(ライブラリがあいまいな変換パスをどのように解決するか)。

#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

おかげで、残念ながら私はコンパイルします:この場合、あなたはmpq_rational(すなわちmpz_int)のための基本となる型に変換する中間ステップを使用して、コンパイラを助けることができますエラー:エラー:静的アサーションが失敗しました:std :: numeric_limits :: is_specialized – Mary

+0

あなたは何のバージョンのブーストですか?私はブーストでそれをテストした1.62 – sehe

+0

ブーストバージョン1_61_0 – Mary