Подтвердить что ты не робот

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.

EDIT:

Я пробовал реализовать свой собственный is_true

<typename T>
inline bool is_true(const T v)
{
    return std::not_equal_to<T>()(T(0),v);
}
4b9b3361

Ответ 1

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

Примерами являются:

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


Следует отметить, что можно просто взять "Custom Real Type Adapter" и искать-n-заменить строку "real:: type" на __ float128 и некоторые другие незначительные изменения заменяют, и все должно быть хорошо.

Ответ 2

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

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