首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost:从整数到cpp_dec_float编译错误的多精度转换

boost:从整数到cpp_dec_float编译错误的多精度转换
EN

Stack Overflow用户
提问于 2014-09-10 14:31:33
回答 1查看 1K关注 0票数 2

我遇到了将一些代码转移到服务器上的问题。

这个问题的一个最小的工作示例是以下代码(文件名mp2.cpp):

代码语言:javascript
运行
复制
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>

using namespace std;
using namespace boost::multiprecision;

int main() {
    uint128_t a = 1;
    uint128_t b = 2;
    cpp_dec_float_50 fa = static_cast<cpp_dec_float_50>(a);
    cpp_dec_float_50 fb = static_cast<cpp_dec_float_50>(b);
    cout << fa / fb << endl;
    return 0;
}

按预期编译和工作,在我的开发工具机器上的标准输出上编写0.5 (g++ 4.6.3,boost 1.55,32位CPU)。

对于相同的代码,g++在服务器上编译失败,出现以下错误:

代码语言:javascript
运行
复制
In file included from /usr/local/include/boost/multiprecision/number.hpp:22:0,
                 from /usr/local/include/boost/multiprecision/cpp_int.hpp:12,
                 from mp2.cpp:1:
/usr/local/include/boost/multiprecision/detail/generic_interconvert.hpp: In instantiation of 'void boost::multiprecision::detail::generic_interconvert(To&, const From&, const mpl_::int_<1>&, const mpl_::int_<0>&) [with To = boost::multiprecision::backends::cpp_dec_float<50u>; From = boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>]':
/usr/local/include/boost/multiprecision/number.hpp:108:7:   required from 'boost::multiprecision::number<Backend, ExpressionTemplates>::number(const boost::multiprecision::number<Other, ET>&, typename boost::enable_if_c<(! boost::multiprecision::detail::is_explicitly_convertible<Other, Backend>::value)>::type*) [with Other = boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>; boost::multiprecision::expression_template_option ET = (boost::multiprecision::expression_template_option)0u; Backend = boost::multiprecision::backends::cpp_dec_float<50u>; boost::multiprecision::expression_template_option ExpressionTemplates = (boost::multiprecision::expression_template_option)1u; typename boost::enable_if_c<(! boost::multiprecision::detail::is_explicitly_convertible<Other, Backend>::value)>::type = void]'
mp2.cpp:11:55:   required from here
/usr/local/include/boost/multiprecision/detail/generic_interconvert.hpp:43:4: error: no matching function for call to 'eval_is_zero(boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>&)'
/usr/local/include/boost/multiprecision/detail/generic_interconvert.hpp:43:4: note: candidates are:
In file included from mp2.cpp:2:0:
/usr/local/include/boost/multiprecision/cpp_dec_float.hpp:2905:13: note: template<unsigned int Digits10, class ExponentType, class Allocator> bool boost::multiprecision::backends::eval_is_zero(const boost::multiprecision::backends::cpp_dec_float<Digits10, ExponentType, Allocator>&)
/usr/local/include/boost/multiprecision/cpp_dec_float.hpp:2905:13: note:   template argument deduction/substitution failed:
In file included from /usr/local/include/boost/multiprecision/number.hpp:22:0,
                 from /usr/local/include/boost/multiprecision/cpp_int.hpp:12,
                 from mp2.cpp:1:
/usr/local/include/boost/multiprecision/detail/generic_interconvert.hpp:43:4: note:   'boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>' is not derived from 'const boost::multiprecision::backends::cpp_dec_float<Digits10, ExponentType, Allocator>'
In file included from /usr/local/include/boost/multiprecision/cpp_int.hpp:1787:0,
                 from mp2.cpp:1:
/usr/local/include/boost/multiprecision/cpp_int/misc.hpp:94:4: note: template<unsigned int MinBits1, unsigned int MaxBits1, boost::multiprecision::cpp_integer_type SignType1, boost::multiprecision::cpp_int_check_type Checked1, class Allocator1> typename boost::enable_if_c<(! boost::multiprecision::backends::is_trivial_cpp_int<boost::multiprecision::backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value), bool>::type boost::multiprecision::backends::eval_is_zero(const boost::multiprecision::backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>&)
/usr/local/include/boost/multiprecision/cpp_int/misc.hpp:94:4: note:   template argument deduction/substitution failed:
/usr/local/include/boost/multiprecision/cpp_int/misc.hpp: In substitution of 'template<unsigned int MinBits1, unsigned int MaxBits1, boost::multiprecision::cpp_integer_type SignType1, boost::multiprecision::cpp_int_check_type Checked1, class Allocator1> typename boost::enable_if_c<(! boost::multiprecision::backends::is_trivial_cpp_int<boost::multiprecision::backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value), bool>::type boost::multiprecision::backends::eval_is_zero(const boost::multiprecision::backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>&) [with unsigned int MinBits1 = 128u; unsigned int MaxBits1 = 128u; boost::multiprecision::cpp_integer_type SignType1 = (boost::multiprecision::cpp_integer_type)0u; boost::multiprecision::cpp_int_check_type Checked1 = (boost::multiprecision::cpp_int_check_type)0u; Allocator1 = void]':
/usr/local/include/boost/multiprecision/detail/generic_interconvert.hpp:43:4:   required from 'void boost::multiprecision::detail::generic_interconvert(To&, const From&, const mpl_::int_<1>&, const mpl_::int_<0>&) [with To = boost::multiprecision::backends::cpp_dec_float<50u>; From = boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>]'
/usr/local/include/boost/multiprecision/number.hpp:108:7:   required from 'boost::multiprecision::number<Backend, ExpressionTemplates>::number(const boost::multiprecision::number<Other, ET>&, typename boost::enable_if_c<(! boost::multiprecision::detail::is_explicitly_convertible<Other, Backend>::value)>::type*) [with Other = boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>; boost::multiprecision::expression_template_option ET = (boost::multiprecision::expression_template_option)0u; Backend = boost::multiprecision::backends::cpp_dec_float<50u>; boost::multiprecision::expression_template_option ExpressionTemplates = (boost::multiprecision::expression_template_option)1u; typename boost::enable_if_c<(! boost::multiprecision::detail::is_explicitly_convertible<Other, Backend>::value)>::type = void]'
mp2.cpp:11:55:   required from here
/usr/local/include/boost/multiprecision/cpp_int/misc.hpp:94:4: error: no type named 'type' in 'struct boost::enable_if_c<false, bool>'
In file included from /usr/local/include/boost/multiprecision/cpp_int.hpp:18:0,
                 from mp2.cpp:1:
/usr/local/include/boost/multiprecision/detail/generic_interconvert.hpp: In instantiation of 'void boost::multiprecision::detail::generic_interconvert(To&, const From&, const mpl_::int_<1>&, const mpl_::int_<0>&) [with To = boost::multiprecision::backends::cpp_dec_float<50u>; From = boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>]':
/usr/local/include/boost/multiprecision/number.hpp:108:7:   required from 'boost::multiprecision::number<Backend, ExpressionTemplates>::number(const boost::multiprecision::number<Other, ET>&, typename boost::enable_if_c<(! boost::multiprecision::detail::is_explicitly_convertible<Other, Backend>::value)>::type*) [with Other = boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>; boost::multiprecision::expression_template_option ET = (boost::multiprecision::expression_template_option)0u; Backend = boost::multiprecision::backends::cpp_dec_float<50u>; boost::multiprecision::expression_template_option ExpressionTemplates = (boost::multiprecision::expression_template_option)1u; typename boost::enable_if_c<(! boost::multiprecision::detail::is_explicitly_convertible<Other, Backend>::value)>::type = void]'
mp2.cpp:11:55:   required from here
/usr/local/include/boost/multiprecision/rational_adaptor.hpp:252:13: note: template<class IntBackend> bool boost::multiprecision::backends::eval_is_zero(const boost::multiprecision::backends::rational_adaptor<IntBackend>&)
/usr/local/include/boost/multiprecision/rational_adaptor.hpp:252:13: note:   template argument deduction/substitution failed:
In file included from /usr/local/include/boost/multiprecision/number.hpp:22:0,
                 from /usr/local/include/boost/multiprecision/cpp_int.hpp:12,
                 from mp2.cpp:1:
/usr/local/include/boost/multiprecision/detail/generic_interconvert.hpp:43:4: note:   'boost::multiprecision::backends::cpp_int_backend<128u, 128u, (boost::multiprecision::cpp_integer_type)0u, (boost::multiprecision::cpp_int_check_type)0u, void>' is not derived from 'const boost::multiprecision::backends::rational_adaptor<IntBackend>'

服务器在64位CPU上运行g++ 4.7.2和boost 1.56。我已经安装了相同的g++和boost版本,以确定这是否是问题所在,但事实并非如此。

在对源进行实验之后,每当我尝试将整数转换为浮动时,就会出现问题。然而,正如在文件中所提到的,这是正确的方法。

有谁知道问题出在哪里,以及如何解决?

EN

回答 1

Stack Overflow用户

发布于 2014-09-10 22:29:13

我不知道这个库,但问题似乎来自于一个bug (?)使用x86-64体系结构。

应当指出的是:

  1. 我的64位操作系统(Linux 16 - g++ 4.8.1 - boost 1.53)也有同样的问题。
  2. 作为解决办法,您可以使用-m32标志将代码交叉编译为32位二进制(通过成功测试)。
  3. 该问题使用cpp_int整数uint128_t消失。
  4. 奇怪的是,使用以下自定义类型没有编译错误: number >> t128_custom; 将此分配器替换为void (由uint128_t定义)或使用usigned_magnitude时会出现问题。

也许你应该联系boost社区了解更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25768131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档