我正在尝试编译ExprTk库,其精度高于long double
。我认为简化是尝试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);
}
答案 0 :(得分:15)
将ExprTk专门化为自定义数字类型是相当简单的。在项目页面上有两个例子,它们提供了一个清晰简洁的方法来在ExprTk中引入新的数字类型。
示例如下:
真实类型示例使用double类型实现一个简单的实型。此外,它还为ExprTk命名空间提供了必要的补充,在包含实际的ExprTk标头之前需要将其包括在内。
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 以及其他一些次要的替换更改,应该都是好的。
答案 1 :(得分:0)
它显然不支持__float128
(gcc本身几乎不支持它,你需要Boost float128.h
库来做任何远程有用的事情。)
你可以尝试提供缺失的is_true(__float128&)
超载,这应该是相对微不足道的,但我愿意打赌那些不会成为它的终结的钱。