Boost multiprecision自定义精度cpp_float运算及转换异常求助
Boost.Multiprecision自定义精度类型运算报错问题
为了进行精度高于double的计算,我使用了boost::multiprecision库。当使用boost::multiprecision::cpp_bin_float_50或boost::multiprecision::cpp_bin_float_100这类预定义精度类型时,代码能正常运行,示例如下:
#include <boost/multiprecision/cpp_bin_float.hpp> // ... boost::multiprecision::cpp_bin_float_100 Test1, Test2; Test1 = 1.0; Test2 = 2.0; Test1 = Test1 + Test2;
但当我需要自定义精度,比如使用boost::multiprecision::cpp_bin_float<200>时,前3行可以正常执行,但第4行(加法运算)会报错“no matching operator found”,后续需要调用的.convert_to<double>()方法也无法找到。cpp_dec_float类型也存在同样的问题。
编辑:
感谢sehe——我刚想补充同样的内容。我花了很久才找到解决方法,奇怪的是我找不到任何使用..._50或..._100以外自定义长度的示例……
解决方法
问题根源在于cpp_bin_float<N>模板的默认参数配置。预定义的cpp_bin_float_50/cpp_bin_float_100是已经指定完整模板参数的类型别名,比如:
typedef cpp_bin_float<50, digit_base_2, void, boost::int64_t, -1074, 971> cpp_bin_float_50; typedef cpp_bin_float<100, digit_base_2, void, boost::int64_t, -16382, 16383> cpp_bin_float_100;
直接使用cpp_bin_float<200>时,仅指定了精度参数,其余默认参数的组合未启用运算符重载和转换方法的支持。只需显式指定表达式模板相关参数(如et_off),就能让功能正常工作。
正确用法示例:
#include <boost/multiprecision/cpp_bin_float.hpp> // 自定义精度类型,启用表达式模板支持 using MyFloat = boost::multiprecision::cpp_bin_float<200, boost::multiprecision::digit_base_2, boost::multiprecision::et_off>; int main() { MyFloat Test1, Test2; Test1 = 1.0; Test2 = 2.0; Test1 = Test1 + Test2; double result = Test1.convert_to<double>(); return 0; }
也可以根据需求调整其他模板参数(如指数范围、整数类型等),确保类型具备完整的运算和转换能力。
内容的提问来源于stack exchange,提问作者Paul Aner
相关产品推荐
相关产品推荐

