我正在尝试比long double更精确地编译ExprTk库。我以为简单 list 就是尝试GCC的__float128,但是我收到以下编译错误,并且不确定如何更正它。

exprtk.hpp: In instantiation of ‘static T exprtk::details::and_op<T>::process(exprtk::details::and_op<T>::Type, exprtk::details::and_op<T>::Type) [with T = __float128; exprtk::details::and_op<T>::Type = const __float128&]’:
exprtk.hpp:28439:10:   required from ‘void exprtk::parser<T>::load_binary_operations_map(exprtk::parser<T>::binary_op_map_t&) [with T = __float128; exprtk::parser<T>::binary_op_map_t = std::map<exprtk::details::operator_type, __float128 (*)(const __float128&, const __float128&), std::less<exprtk::details::operator_type>, std::allocator<std::pair<const exprtk::details::operator_type, __float128 (*)(const __float128&, const __float128&)> > >; typename exprtk::details::functor_t<T>::bfunc_t = __float128 (*)(const __float128&, const __float128&)]’
exprtk.hpp:15660:51:   required from ‘exprtk::parser<T>::parser(std::size_t) [with T = __float128; std::size_t = long unsigned int]’
mathtof.cpp:18:33:   required from here
exprtk.hpp:9923:105: error: call of overloaded ‘is_true(const __float128&)’ is ambiguous
          static inline T process(Type t1, Type t2) { return (details::is_true(t1) && details::is_true(t2)) ? T(1) : T(0); }
                                                                                                         ^
compilation terminated due to -Wfatal-errors.

编辑:

我已经尝试实现自己的is_true
<typename T>
inline bool is_true(const T v)
{
    return std::not_equal_to<T>()(T(0),v);
}

最佳答案

在自定义数字类型上专门设置ExprTk相当简单。在项目页面上有两个示例,这些示例提供了简洁明了的方法在ExprTk中引入新的数字类型。

示例如下:

  • 自定义实型适配器[link]
  • MPFR适配器[link]

  • 实型示例使用double类型实现简单的实型。此外,它还为ExprTk命名空间提供了必要的添加,在添加实际的ExprTk header 之前需要将其包括在内。

    MPFR适配器建立在前面的示例的基础上,展示了如何轻松地将MPFR/GMP类型修改为可在ExprTk中使用。

    这两个示例都使用新引入的类型随附了完整的测试套件和基准。

    这是一个示例,其中有人将自己的名为 DScalar 的类型改编为ExprTk:

    https://github.com/filiatra/gismo/blob/stable/external/exprtk_ad_adaptor.hpp

    在这里被使用:

    https://github.com/filiatra/gismo/blob/stable/src/gsCore/gsFunctionExpr.hpp#L146

    应该注意的是,您可以简单地将“自定义实型适配器” 并用 __float128 和其他一些较小的替换更改搜索并替换字符串“real::type”,应该都不错。

    09-28 01:50