以固定精度重载 boost::multiprecision::pow
Overload boost::multiprecision::pow with fixed precision
代码如下
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> float_50;
int main()
{
float_50 a = boost::multiprecision::pow((float_50)5, (float_50)10); // works
double b = boost::multiprecision::pow((double)5, (double)10); // doesn't work
//double b = boost::multiprecision::pow<double>((double)5, (double)10); // Why can't be overloaded?
return 0;
}
无法编译,因为 boost::multiprecision::pow
无法识别固定精度类型。通常的解决方案是什么?我宁愿有一个接受多精度和固定精度类型的 pow
函数。例如,boost 常量具有模板定义,这对我来说很奇怪
boost::math::constants::pi<double>()
boost::math::constants::pi<float_50>()
工作正常。 boost::multiprecision::pow
不应该也被重载吗?
单个函数无法处理不同类型的参数。每个支持的参数集都需要一个单独的函数。该函数可能是从模板自动生成的——但 pow
似乎不是模板实现的候选对象。
solution是去掉命名空间。
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> float_50;
int main()
{
float_50 a = pow((float_50)5, (float_50)10);
double b = pow(5., 10.);
return 0;
}
代码如下
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> float_50;
int main()
{
float_50 a = boost::multiprecision::pow((float_50)5, (float_50)10); // works
double b = boost::multiprecision::pow((double)5, (double)10); // doesn't work
//double b = boost::multiprecision::pow<double>((double)5, (double)10); // Why can't be overloaded?
return 0;
}
无法编译,因为 boost::multiprecision::pow
无法识别固定精度类型。通常的解决方案是什么?我宁愿有一个接受多精度和固定精度类型的 pow
函数。例如,boost 常量具有模板定义,这对我来说很奇怪
boost::math::constants::pi<double>()
boost::math::constants::pi<float_50>()
工作正常。 boost::multiprecision::pow
不应该也被重载吗?
单个函数无法处理不同类型的参数。每个支持的参数集都需要一个单独的函数。该函数可能是从模板自动生成的——但 pow
似乎不是模板实现的候选对象。
solution是去掉命名空间。
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> float_50;
int main()
{
float_50 a = pow((float_50)5, (float_50)10);
double b = pow(5., 10.);
return 0;
}