В основном используя python, я избалован тем, что мне не нужно беспокоиться о целочисленном переполнении. Теперь, когда я использую numpy, мне снова приходится об этом беспокоиться. Я хотел бы, чтобы numpy ошибался в случаях переполнения, но, похоже, это не работает для int64.
import numpy
numpy.seterr(all='raise')
print("{:,}".format(numpy.prod([10]*50)))
# -5,376,172,055,173,529,600
print("{:,}".format(numpy.int64(3200000000) * numpy.int64(3200000000)))
# -8,206,744,073,709,551,616
print("{:,}".format(numpy.int32(320000) * numpy.int32(320000)))
# FloatingPointError: overflow encountered in int_scalars -- Finally getting an error!
Я всегда мог бы добавить dtype=object
, чтобы исправить эти проблемы, но я думаю, что int64 достаточно хорош в большинстве случаев, просто страшно, что он может выйти из строя таким трудно обнаруживаемым способом.
Почему seterr работает только для int32? Могу ли я заставить его работать для int64?
Единственная часть документов numpy.seterr, которую я можно найти, что может намекнуть на то, почему это может быть так, следующий короткий отрывок:
Обратите внимание, что операции над целочисленными скалярными типами (например, int16) обрабатываются как с плавающей запятой, и на них влияют эти настройки.
Но ничто в документах типа данных не предполагает, что int32 и int64 как-то концептуально разные. Не уверен, что int64 не считается «целочисленным скалярным типом».