Я обнаружил что-то странное - PullRequest
0 голосов
/ 21 марта 2020

Ошибка с Python. Вот код:

print(np.sum(np.power(range(26), 6)))
print(np.sum(np.power(range(26), 7)))

, который дает следующие результаты:

998881325
792709145

Как может сумма (х в степени 6) <сумма (х в степени) из 7)!?! </p>

РЕДАКТИРОВАТЬ


Я на Python 3.7.3 и numpy 1.16.2.

1 Ответ

3 голосов
/ 21 марта 2020

Вы генерируете целые числа, которые больше, чем могут обрабатывать значения вашей платформы или значения по умолчанию numpy int, поэтому переполняет ваши числа.

25 для седьмой степени требует 33 бита:

>>> (25 ** 7).bit_length()
33

* Встроенный целочисленный тип 1032 * равен неограничен , но numpy использует ограниченный, целые числа фиксированного размера, и для вашей установки numpy тип целого числа со знаком по умолчанию равен int32, поэтому он не может соответствовать этому значению.

Я могу воспроизвести точно такой же вывод, если я скажу numpy преобразовать вывод в int32:

>>> np.sum(np.power(range(26), 7)).astype(np.int32)
792709145

, но поскольку у меня MacOS на 64-битном процессоре, numpy использует int64 в качестве целочисленного типа по умолчанию и, таким образом, дает правильный результат:

>>> np.sum(np.power(range(26), 7))
22267545625
>>> np.sum(np.power(range(26), 7)).dtype
dtype('int64')

792709145 - это целочисленное значение, представленное нижними 31 битами:

>>> print(int(format(22267545625, 'b')[-31:], 2))
792709145

Вкл. Windows, однако по умолчанию numpy целочисленный тип - int32 потому что даже на 64-битном оборудовании Windows определяет C long int как 32-битное значение.

Вы должны указать numpy создать массив значений int64 здесь:

np.sum(np.power(np.arange(26, dtype=np.int64), 7))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...