mi butto i miei due centesimi in qui.
In primo luogo, la soluzione proposta nelle altre risposte che dice di usare un typedef esterno non è solo una soluzione, cioè il modo in cui i documenti Cython dicono che cose come questa dovrebbero essere fatte. Vedere the relevant section. Preventivo: "Se il file di intestazione utilizza nomi typedef come word
per fare riferimento a tipi di tipi numerici dipendenti dalla piattaforma, sarà necessaria un'istruzione ctypedef corrispondente, ma non è necessario che corrisponda esattamente al tipo, basta usare qualcosa del tipo giusto tipo generale (int, float, ecc.) Ad esempio, ctypedef int word
funzionerà correttamente qualunque sia la dimensione effettiva di un word
(se il file di intestazione lo definisce correttamente). La conversione da e verso i tipi Python, se presenti, verrà utilizzata anche per questo nuovo tipo. "
Inoltre, non è necessario creare effettivamente un file di intestazione con un typedef per un tipo che hai già incluso da qualche altra parte lungo la strada. solo fare questo
cdef extern from *:
ctypedef int int128 "__int128_t"
Oppure, se avete voglia di mantenere il nome lo stesso in Cython come in C,
cdef extern from *:
ctypedef int __int128_t
Ecco un test per dimostrare che questo è in funzione. Se l'aritmetica a 128 bit funziona, a > 1
, e a è rappresentabile come un numero intero a 64 bit, la prima funzione stamperà nuovamente lo stesso numero. Se non lo è, l'overflow dei numeri interi dovrebbe causarne la stampa 0. La seconda funzione mostra cosa succede se si utilizza l'aritmetica a 64 bit.
Cython il file
# cython: cdivision = True
cdef extern from *:
ctypedef int int128 "__int128_t"
def myfunc(long long a):
cdef int128 i = a
# set c to be the largest positive integer possible for a signed 64 bit integer
cdef long long c = 0x7fffffffffffffff
i *= c
cdef long long b = i/c
print b
def myfunc_bad(long long a):
cdef long long i = a
# set c to be the largest positive integer possible for a signed 64 bit integer
cdef long long c = 0x7fffffffffffffff
i *= c
cdef long long b = i/c
print b
In Python, dopo che entrambe le funzioni sono state importate, myfunc(12321)
stampe il valore corretto, mentre myfunc_bad(12321)
stampe 0.
@BrettHale posso non basta digitare 'cdef __int128_t x = 0 '. Non viene compilato. –
Che cosa è esattamente 'cdef' in questo contesto? –
Apparentemente non è chiaro che questa domanda riguardi cython, anche se nel titolo si dice. –