Verwendung von 128-Bit-Ganzzahlen in Cython

8

Auf meinem 64-Bit-Computer hat der long long -Typ 64 Bits.

%Vor%

Ich brauche 128-Bit-Ganzzahlen und glücklicherweise GCC unterstützt diese . Wie kann ich diese in Cython verwenden?

Folgendes funktioniert nicht. Kompilieren von foo.pyx enthält nur

%Vor%

ergibt

%Vor%     
Chiel ten Brinke 20.12.2014, 16:11
quelle

3 Antworten

8

BEARBEITEN: Dies ist KEINE Umgehung, das ist der richtige Weg. Siehe auch die Antwort von @ IanH.

Nun haben Sie das Problem, dass cython Ihren Typ nicht erkennt, während gcc dies tut. Also können wir versuchen, cython zu überlisten.

Datei helloworld.pyx :

%Vor%

Datei header_int128.h :

%Vor%

Datei setup.py :

%Vor%

Nun, auf meinem Rechner, wenn ich python setup.py build_ext --inplace starte, vergeht der erste Schritt, und die Datei helloworld.c wird generiert, und dann wird auch die gcc Kompilierung übergeben.

Wenn Sie jetzt die Datei helloworld.c öffnen, können Sie überprüfen, ob Ihre Variable foo tatsächlich als int128 deklariert ist.

Seien Sie sehr vorsichtig bei der Verwendung dieser Problemumgehung. Insbesondere kann es vorkommen, dass Cython keine Umwandlung in den C-Code erfordert, wenn Sie beispielsweise int128 einem int64 zuweisen, weil es in diesem Schritt des Prozesses nicht zwischen ihnen unterscheidet.

>     
gg349 20.12.2014, 19:24
quelle
4

Ich werde meine zwei Cent hier hineinwerfen.

Erstens ist die in den anderen Antworten vorgeschlagene Lösung, ein externes typedef zu verwenden, nicht nur eine Problemumgehung, das ist die Art, wie die Cython-Dokumente solche Dinge sagen sollten. Siehe den entsprechenden Abschnitt . Zitat: "Wenn die Header-Datei typedef-Namen wie word verwendet, um auf plattformabhängige Varianten von numerischen Typen zu verweisen, benötigen Sie eine entsprechende ctypedef-Anweisung, aber Sie müssen den Typ nicht genau abgleichen, sondern nur etwas von der richtige allgemeine Typ (int, float usw.) Zum Beispiel funktioniert ctypedef int word in Ordnung, unabhängig von der tatsächlichen Größe eines word (sofern die Header-Datei dies korrekt definiert.) Konvertierung zu und von Python-Typen, falls vorhanden. wird auch für diesen neuen Typ verwendet. "

Außerdem ist es nicht notwendig, eine Header-Datei mit einem typedef für einen Typ zu erstellen, den Sie bereits an anderer Stelle eingefügt haben. Tun Sie das einfach

%Vor%

Oder, wenn Sie möchten, dass der Name in Cython gleich bleibt wie in C,

%Vor%

Hier ist ein Test, um zu zeigen, dass das funktioniert. Wenn die 128-Bit-Arithmetik funktioniert, a > 1 , und a als 64-Bit-Ganzzahl darstellbar ist, wird die erste Funktion dieselbe Zahl wieder ausgeben. Wenn dies nicht der Fall ist, sollte ein Integer-Überlauf dazu führen, dass 0 gedruckt wird. Die zweite Funktion zeigt, was passiert, wenn 64-Bit-Arithmetik verwendet wird.

Cython-Datei

%Vor%

Nachdem in Python beide Funktionen importiert wurden, druckt myfunc(12321) den korrekten Wert, während myfunc_bad(12321) 0 ausgibt.

    
IanH 22.12.2014 19:15
quelle
3

Hier ist ein Beispiel für die Verwendung des von @Giulio Ghirardo vorgeschlagenen Hacks.

Die Datei cbitset.px enthält:

%Vor%

Die Datei bitset.pyx enthält:

%Vor%

Die Datei main.pyx enthält:

%Vor%

Die Datei setup.py enthält:

%Vor%

Kompilieren Sie dies mit dem Befehl

%Vor%

und mit dem Befehl

ausführen %Vor%     
Chiel ten Brinke 21.12.2014 20:08
quelle

Tags und Links