2016-11-02 27 views
2

Ich benutze Sympy, um eine benutzerdefinierte Eingabefunktion zu manipulieren und zu differenzieren, um eine C++ - Bibliothek zu generieren, die mit einem externen C++ - Programm verwendet werden soll. Es funktioniert super, außer dass Sympy 1/2 als 1.0L/2.0L ausdrückt. Fein, außer dass einige der Variablen im Hauptcode vom Typ std :: complex sind, verursacht dies einen Fehler bei der Kompilierung, da es nicht (implizit) einen Komplex mit langen Doubles multiplizieren/addieren/subtrahieren kann (oder ints, für diese Angelegenheit). Ich habe versucht, mit -std = C++ 14 zu kompilieren, da dies mehr Unterstützung für implizites Typcasting bietet, aber das "Problem" bleibt bestehen.sympy ccode Nummer Typ

In der Zwischenzeit habe ich eine Reihe von Hilfsfunktionen geschrieben, um mit diesen Operationen umzugehen, aber ich frage mich, ob es irgendeinen Weg gibt, Sympy zu sagen, irgendeinen numerischen Wert auszugeben, den es als Doppel hat? Anstatt beispielsweise 1.0L/2.0L an den C-Code auszugeben, kann ich ihn zwingen, nur 1.0/2.0 (oder sogar 0.5) zu schreiben? Ebenso, anstatt einen int wie 2 zu schreiben, möchte ich 2.0 schreiben. Ich habe versucht, das Präzisionsflag (im Funktionsaufruf sympy.printing.ccode) einzustellen, aber es hat nichts geändert. Ich konnte anscheinend nichts online finden

Ich wäre sehr dankbar für jeden Rat.

Vielen Dank, Sam

Antwort

1

Im Moment gibt es keine Option für diese (ich eine issue für sie geöffnet).

Eine Problemumgehung besteht darin, sympy.printing.ccode.CCodePrinter zu unterteilen und _print_Rational zu überschreiben. Dies ist die aktuelle Definition:

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

So können Sie so etwas wie

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

Sie dann Ausdrücke mit MyCCodePrinter().doprint(expr) drucken schreiben kann.

+0

Danke, @asmeurer, das ist eine große Hilfe. Da ich alle Vorkommen von 'L' entfernen wollte, habe ich dann' CCodePrinter._print_Rational = MyCCodePrinter._print_Rational' verwendet, um die '_print_Rational' Funktion, die von' sympy.printing.ccode() 'verwendet wird, an meine Unterklasse neu zu binden. Genau das habe ich gesucht. – samwise

+0

Es ist nicht nötig, den SymPy-Code zu patchen. Sie können aus Ihrer Klasse mit 'doprint' drucken. Siehe meine aktualisierte Antwort. – asmeurer

+0

Ah danke, das ist viel besser. Entschuldigung, ich bin ziemlich neu in Python. Wenn ich genug Repräsentieren würde, um deine Antwort zu verbessern, würde ich das tun! – samwise