2015-09-24 51 views
13

long doubleより精度の高いExprTkライブラリをコンパイルしようとしています。私は単純化した人がGCCの__float128を試してみるだろうと思ったが、私は次のコンパイルエラーを受けていて、それを修正する方法がわからない。精度が向上したExprTk

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:

私はそれは明らかに__float128をサポートしていませんis_true

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

'is_true'対' is_true_impl'ですか?また、エラーに基づいて、 'details'名前空間の中に配置する必要があります。 'is_true'は修飾名を使って呼び出されるため、ADLはトリガーしません。 –

+0

私の間違いは、それは 'is_true'でした。私は 'is_true_impl'を' is_true'と 'is_ture_impl'の他の定義と直接インラインでコピーすることで作ったのです。 –

+0

名前空間に 'is_true'アカウントを定義しようとしましたか? –

答えて

15

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

例は以下のとおりです。

  1. カスタム実数型アダプタ[link]
  2. MPFRアダプタ[link]

実数型の例は、double型を使用して、簡単な実数型を実装します。さらに、実際のExprTkヘッダーをインクルードする前に、ExprTk名前空間に追加する必要があります。

MPFRアダプタは、前の例をベースにしており、ExprTkで使用するためにMPFR/GMPタイプをどのように容易に適合させることができるかを示しています。

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

https://github.com/filiatra/gismo/blob/stable/external/exprtk_ad_adaptor.hpp

、ここでそれが使用されている:

https://github.com/filiatra/gismo/blob/stable/src/gsCore/gsFunctionExpr.hpp#L146


をここで


は、誰かがExprTkにDScalarと呼ばれる自分のタイプを適応している例です。

一つには、単に「カスタム実数型アダプタ」を取ると、検索-N-置き換える__float128や他のいくつかのマイナーでの文字列「本物::タイプを」変更を交換し、あるべきことに留意すべきですすべて行こうと思う。

+0

私の瓶は文字通りドロップされました。私はここで尋ねる前にそこを見たと約束した。 –

+0

提供されたアダプターの例は実際に私のためにコンパイルされません。私はまだMPFRを試していない。 –

+3

@chewsocksもう一度ダウンロードし直すと、printfに問題が発生している可能性があります。また、exprtk.hppを両方のパッケージに必要な場所にダウンロードの一部として含めます。 –

0

自分を実装しようとしました(GCC自体はかろうじてそれをサポートして、あなたがするブーストfloat128.hライブラリが必要遠隔操作で役立つもの)。

あなたは、不足しているis_true(__float128&)を提供しようとすることができます、それは比較的些細なものでなければなりませんが、私はそれの終わりではないお金を賭けて喜んでいます。

+0

gccの' __float128'へのサポートについての知識は、数年前です。あなたのガーデン・バラエティGPUで一度に何十億ものことをすることができるとき、ソフトウェアのエミュレートされた浮動小数点演算の市場はあまりありません:) – Blindy

+0

さて、私はそれを計算したので、boost :: multiprecision :: cpp_dec_float_100'を使って変更しました。より完全な過負荷が設定されます。いいえ、同じ問題。 –

+0

GPU上で浮動小数点計算を行うことの意味がわかりません。ソフトウェア実装の利点は高精度です。最近まで、GPUは32ビットの浮動小数点しかできませんでした。 –

関連する問題