14

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);
}
4

2 に答える 2

16

カスタム数値型で ExprTk を特殊化するのはかなり簡単です。プロジェクトのページには、ExprTk 内に新しい数値型を導入するための明確で簡潔な手段を提供する 2 つの例があります。

例は次のとおりです。

  1. カスタム実数型アダプター[リンク]
  2. MPFR アダプター[リンク]

実数型の例では、double 型を使用して単純な実数型を実装しています。さらに、実際の ExprTk ヘッダーを含める前に含める必要がある ExprTk 名前空間に必要な追加を提供します。

MPFR アダプターは前の例に基づいて構築されており、ExprTk で使用するために MPFR/GMP タイプを簡単に適応させる方法を示しています。

どちらの例も、新しく導入された型を使用した完全なテスト スイートとベンチマークにパッケージ化されています。


以下は、誰かが 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


「カスタム実数型アダプター」を使用して、文字列「real::type」を検索して__float128に置換し、その他のマイナーな置換変更を行うだけでよいことに注意してください。

于 2015-09-25T03:38:48.140 に答える
0

明らかにサポートしていません__float128(gcc 自体はほとんどサポートしていませんfloat128.h。リモートで何かを行うには Boost ライブラリが必要です)。

不足しているis_true(__float128&)過負荷を提供することを試みることができます。それは比較的些細なことですが、私はお金を賭けても構わないと思っています。

于 2015-09-24T16:50:00.360 に答える