【问题标题】:boost::multiprecision::numberboost::multiprecision::number
【发布时间】:2017-03-17 00:53:17
【问题描述】:

我是使用 boost 库的新手,所以我感谢所有帮助我的人。

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

并得到新的编译器错误:

[编译错误]

【问题讨论】:

    标签: c++ boost boost-multiprecision


    【解决方案1】:

    根据定义,有理数具有整数的分子和分母。

    浮点到整数的转换 - 再次根据定义 - 不是无损的。编译器只会编译静态已知无损的转换。

    此外,转换不会被链接(库如何解决模棱两可的转换路径?)。在这种情况下,您可以帮助编译器使用中间步骤转换为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
    

    【讨论】:

    • 感谢您的关注,但不幸的是我收到编译错误:错误:静态断言失败:std::numeric_limits::is_specialized
    • 您使用的是哪个版本的 boost?我在 Boost 1.62 上对其进行了测试
    • 提升版本 1_61_0
    • 我建议使用 1.62 进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2015-06-24
    相关资源
    最近更新 更多