Я пытаюсь скомпилировать библиотеку 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);
}
Довольно просто специализировать 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
Следует отметить, что можно просто взять «Пользовательский адаптер реального типа» и search-n-заменить строку «real :: type» на __float128 и некоторые другие незначительные изменения замены и должно быть все хорошо идти.
Это явно не поддерживает __float128
(сам gcc его едва поддерживает, вам нужен Boost float128.h
библиотека, чтобы сделать что-нибудь полезное с ним).
Вы можете попытаться предоставить недостающие is_true(__float128&)
перегрузка, это должно быть относительно тривиально, но я готов поспорить, что деньги на этом не закончатся.