Ta odpowiedź nie jest naprawdę odpowiedź: jest próbą lepszego zrozumienia problemu!
Pythona 2.7.13 Mam
In [24]: a = 9223372036854775808; type(a)
Out[24]: long
Choć w python 3.6.0 Mam
In [24]: a = 9223372036854775808; type(a)
Out[24]: int
I to jest spójne z tym, że długo jeszcze nazwie int nawet jeśli zachowuje się jak długo w Python3.
Czy może to być częścią problemu zgłoszonego błędu? Jeśli pozostaniemy w Python2, czy to, co zobaczysz, może być błędem numpy w zapytaniu o typ wartości przechowywanej w zmiennej podczas wykonywania mnożenia? Rozważ
In [11]: type(int(9223372036854775807))
Out[11]: int
In [12]: type(int(9223372036854775808))
Out[12]: long
In [13]: a = 9223372036854775808
In [14]: b = np.int64(0)
In [15]: type(9223372036854775808 * np.int64(0))
Out[15]: long
In [16]: type(b*a)
Out[16]: numpy.float64
In [17]: type(long(9223372036854775808) * np.int64(0))
Out[17]: long
In [18]: type(int(9223372036854775808) * np.int64(0))
Out[18]: long
In [19]: type(np.int64(9223372036854775808) * np.int64(0))
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-18-93a64125698a> in <module>()
----> 1 type(np.int64(9223372036854775808) * np.int64(0))
OverflowError: Python int too large to convert to C long
Liczba 9223372036854775808 są przechowywane tak długo.
Linia 15 procesor mówi "długie czasy int64 jest długi, ponieważ jest to największy kontener".
Linia 16 procesor widzi jako int i powiedział „int razy np.int64 jest np.int64 jako wolę przechowywać go w rodzaju numpy, ponieważ to nazwać, ale czekać ... 9223372036854775808 nie może pozostać w int64, więc mam teraz kłopoty (nieoczekiwane kłopoty, jak to się nie dzieje, gdy używam tylko typu numpy - wiersz 19). Następnie ustawiłem się w "trybie awaryjnym" przechowując wyniki domyślnie w największym pojemniku numpy jaki mam, który jest float64 ".
w liniach Python3 15 i 16 zachowuje się inaczej: numpy idzie zawsze w trybie „trouble” jak długo typ jest zawsze wykrywany jako int:
In [10]: type(9223372036854775808 + np.int64(0))
Out[10]: numpy.float64
In [11]: type(a*b)
Out[11]: numpy.float64
* Czy istnieją jakieś rozsądne wytłumaczenie dla niego * Tak, jest to obsługa zakresu wartości zasięgu. – wallyk
Rozumiem, ale wydaje mi się dziwne, że typ jest poprawnie rzucany na długo, gdy liczba całkowita jest zwiększona do 92233720368547758100. Czy więc "długi" jest jedynym bezpiecznym sposobem na obsługę długich liczb? –
Z dokumentacji https://docs.python.org/2/library/stdtypes.html#numeric-tites-int-float-long-complex, ** Długie liczby całkowite mają nieograniczoną precyzję. ** Prawdopodobnie jest to wybór efektywności : pływaki mają ograniczoną precyzję i zasięg, ale są one szybkie obliczeniowo. Nieograniczona precyzja Longs może być bardzo kosztowna w arytmetyce, więc rzucanie jest uzasadnione, aby wyraźnie poprosić o taką kompromis. – wallyk