c++ - 精度更高的 ExprTk

标签 c++ templates c++11 exprtk

我正在尝试以比 long double 更高的精度编译 ExprTk 库。我认为最简单的方法是尝试 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 中引入新的数字类型提供了清晰简洁的方法。

例子是:

  1. 自定义实型适配器[link]
  2. 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


需要注意的是,可以简单地使用 "Custom Real Type Adaptor" 并搜索-n-将字符串 "real::type"替换为 __float128 和其他一些小的替换更改,应该一切顺利。

关于c++ - 精度更高的 ExprTk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766364/

相关文章:

c++ - 具有可变参数模板的类成员函数继承

c++ - 在 Ubuntu : "Invalid or incomplete multibyte or wide character", 和有趣的 UTF-8 字符上执行编译文件

C++ g++ 在类头文件中找不到 'string' 类型

c++ - ISO C++ 的带有零参数的可变参数宏

c++ - 我在模板类中有多个 * 运算符的重载。为什么按不同的顺序放置声明会得到不同的结果?

C++ 模板函数 : explicit instantiate one or more specializations

c++ - 在 Linux 上的 eclipse 中清理项目不会删除 Debug/Release 文件夹

c++ - 在此 "number of elements"宏中添加虚拟字符的目的是什么?

C++11 thread::id 表示无线程的特殊值

c++ - C++0x 标准如何定义 C++ Auto 多重声明?