ExprTk с повышенной точностью

Я пытаюсь скомпилировать библиотеку 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);
}

13

Решение

Довольно просто специализировать ExprTk для пользовательского числового типа. На странице проекта есть ДВА примера, которые дают ясные и лаконичные средства для введения новых числовых типов в ExprTk.

Примеры:

  1. Пользовательский реальный тип адаптера [ссылка на сайт]
  2. MPFR адаптер [ссылка на сайт]

Пример реального типа реализует простой реальный тип используя двойной тип. Кроме того, он обеспечивает необходимые дополнения в пространстве имен 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


Следует отметить, что можно просто взять «Пользовательский адаптер реального типа» и search-n-заменить строку «real :: type» на __float128 и некоторые другие незначительные изменения замены и должно быть все хорошо идти.

15

Другие решения

Это явно не поддерживает __float128 (сам gcc его едва поддерживает, вам нужен Boost float128.h библиотека, чтобы сделать что-нибудь полезное с ним).

Вы можете попытаться предоставить недостающие is_true(__float128&) перегрузка, это должно быть относительно тривиально, но я готов поспорить, что деньги на этом не закончатся.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector