Сумма Python и сумма numpy дают разные результаты [duplicate]

Для Firefox и Chrome:

<div style="width:100%;">
  <div style="width: 50%; margin: 0px auto;">Text</div>
</div>

Для Internet & nbsp; Explorer, Firefox и Chrome:

<div style="width:100%; text-align:center;">
  <div style="width: 50%; margin: 0px auto; text-align:left;">Text</div>
</div>

Свойство text-align: необязательно для современных браузеров, но оно необходимо в режиме Internet & nbsp; Quirks Mode для поддержки устаревших браузеров.

8
задан Aaron 4 April 2017 в 14:21
поделиться

2 ответа

Здесь нет ошибки здесь. Это явление известно как целочисленное переполнение .

x = np.arange(1,100000001)
print(x.sum())  # 987459712
print(x.dtype)  # dtype('int32')

32-битный целочисленный тип, используемый в arange для данного входа, просто не может содержать 5000000050000000. В лучшем случае это может занять 2147483647 .

Если вы явно используете тип данных с большим целым или с плавающей точкой, вы получите ожидаемый результат.

a = np.arange(1, 100000001, dtype='int64').sum()
print(a)  # 5000000050000000

a = np.arange(1.0, 100000001.0).sum()
print(a)  # 5000000050000000.0
9
ответ дан Community 19 August 2018 в 20:10
поделиться
  • 1
    Звучит как «ошибка». для меня, особенно в Python, где при необходимости используются длинные целые числа. Конечно, numpy делает свою собственную арифметику, но в качестве числового пакета лучше иметь дело с вычислениями, не хуже. – alexis 4 April 2017 в 15:02
  • 2
    @alexis Я не думаю, что это ошибка, потому что это документированное поведение. Документы говорят, что по умолчанию arange вводит тип данных из ввода. Так как 100000001 достаточно мало, кажется разумным использовать int32. На самом деле, поскольку я работаю на 32-битном Python и использую целые массивы в основном для индексирования, я понимаю, что по умолчанию используется тип данных размера указателя. – kazemakase 4 April 2017 в 15:31

Я подозреваю, что вы используете Windows, где тип данных результата представляет собой 32-битное целое число (в то время как для тех, кто использует, скажем, Mac OS X или Linux, тип данных - 64 бит). Обратите внимание, что 5000000050000000 % (2**32) = 987459712

Попробуйте использовать

a = np.arange(1, 100000001, dtype=np.int64).sum()

или

a = np.arange(1, 100000001).sum(dtype=np.int64)

P.S. Любой, кто не использует Windows, может воспроизвести результат следующим образом:

>>> np.arange(1, 100000001).sum(dtype=np.int32)
987459712
5
ответ дан Warren Weckesser 19 August 2018 в 20:10
поделиться
  • 1
    Хорошее наблюдение, что это зависит от Windows! – kazemakase 4 April 2017 в 14:37
  • 2
    Ты так много! Решил мой вопрос! – Horus Ricardo Junoy 6 April 2017 в 14:08
Другие вопросы по тегам:

Похожие вопросы: