Есть ли у numpy.dot ограничения точности для больших массивов? - PullRequest
0 голосов
/ 07 февраля 2019

Не становится ли numpy.dot неправильным для больших массивов?Я использую iMac с 4 ГГц процессором Intel Core i7 и 32 ГБ 1600 МГц DDR3.Я выполнил простой эксперимент для сравнения суммы квадратов от 1 до большого числа, используя цикл for против векторизации.Когда сумма достаточно велика, подход векторизации является неправильным.См. Эксперимент ниже:

i = 3024617
sum([j**2 for j in range(1,i)]) - np.dot(np.arange(1,i,dtype=np.int64), np.arange(1,i, dtype=np.int64))

i = 3024618
sum([j**2 for j in range(1,i)]) - np.dot(np.arange(1,i,dtype=np.int64), np.arange(1,i, dtype=np.int64))

Первая разница - и разница для любого i <3024617 равна 0 </p>

Вторая разница - и разница для любого i> = 3024618 равнабольшое целое число

Я ожидаю, что эта разница будет 0 для всех целых чисел i.

1 Ответ

0 голосов
/ 07 февраля 2019

Python целые числа не ограничены.int64 ограничено тем, что может представлять 64-разрядное целое число со знаком:

>>> i = 3024617
>>> x = sum([j**2 for j in range(1,i)])
>>> x
9223371388520336796
>>> hex(x)
'0x7fffff690c418d9c'
>>> x.bit_length()
63

Таким образом, эта сумма просто помещается в 64-разрядное целое число со знаком.Добавьте также i**2, и он больше не будет:

>>> x += i**2
>>> hex(x)
'0x800007bb0de78dad'
>>> x.bit_length()
64

Невозможно точно представить эту сумму в 64-битном целом со знаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...