2016-11-02 15 views
2

私は、外部C++プログラムで使用するC++ライブラリを生成するために、ユーザ定義の入力関数を操作して区別するためにSympyを使用しています。それは、Sympyが1.0L/2.0Lとして1/2を表現しようとしていることを除いて、素晴らしいことです。これは主なコードの変数のいくつかがstd :: complex型であることを除いて、コンパイル時にエラーが発生します。なぜなら、long double型(またはint型)の複合体を(暗黙的に)乗算/そのことについては)。私は-std = C++ 14でコンパイルしようとしました。これは、暗黙の型キャストのサポートが増えたためですが、 "問題"が残っています。sympyコード番号タイプ

その間、私はこれらの操作に対処するヘルパー関数のセットを書いてきましたが、Sympyに二重として出力するように指示する方法があるのだろうかと思っていましたか?例えば、1.0L/2.0LをCコードに出力するのではなく、強制的に1.0/2.0(またはさらに0.5)を書き込むことができますか?同様に、2のようなintを書くのではなく、2.0を書いてみたいです。私は精度フラグ(sympy.printing.ccode関数呼び出しで)を設定しようとしましたが、何も変更されませんでした。私はオンラインで何かを見つけることができませんでした

私はどんなアドバイスにも大変感謝しています。

多くのおかげで、 サム

答えて

1

は今のところ、このためのオプションは(私はそれのためにissueをオープンしました)がありません。

sympy.printing.ccode.CCodePrinterをサブクラス化し、_print_Rationalを上書きすることで回避できます。これは、現在の定義である:

def _print_Rational(self, expr): 
    p, q = int(expr.p), int(expr.q) 
    return '%d.0L/%d.0L' % (p, q) 

だから、あなたはあなたが、その後MyCCodePrinter().doprint(expr)で式を印刷することができ

class MyCCodePrinter(CCodePrinter): 
    def _print_Rational(self, expr): 
     p, q = int(expr.p), int(expr.q) 
     return '%d.0/%d.0' % (p, q) 

ような何かを書くことができます。

+0

ありがとう、@asmeurer、それは大きな助けです。私は 'L 'の出現をすべて取り除きたいので、' sympy.printing.ccode() 'が私のサブクラスに使う' _print_Rational'関数をリバインドするために 'CCodePrinter._print_Rational = MyCCodePrinter._print_Rational'を使いました。これはまさに私が探していたものです。 – samwise

+0

SymPyコードを猿でパッチする必要はありません。 'doprint'を使ってクラスから印刷することができます。私の更新された答えを見てください。 – asmeurer

+0

ああ、ありがとう、それははるかにneaterです。申し訳ありませんが、私はPythonにとって全く新しいです。私はあなたの答えをupvoteするのに十分な担当者があれば、私はしよう! – samwise

関連する問題