![](/img/trans.png)
[英]how to change at runtime number precision with boost::multiprecision
[英]boost::multiprecision::number
我是使用 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>();
並獲得新的編譯器錯誤:
[編譯錯誤]
根據定義,有理數具有整數分子和分母。
浮點到整數的轉換 - 再次根據定義 - 不是無損的。 編譯器只會編譯靜態已知為無損的轉換。
此外,轉換不會被鏈接(庫將如何解決不明確的轉換路徑?)。 在這種情況下,您可以使用轉換為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.