#python #numpy #digits
Вопрос:
Доброе утро, когда я использую приведенный ниже код, я получаю неправильный результат
import numpy as np
print(np.convolve([10**9], [ 10**9]))
Я получаю:-1486618624, в то время как я должен получать: (10 в степени 9) * (10 в степени 9) = (10 в степени 18)
Как я могу преодолеть эту проблему? Очень любопытно, что я получаю правильный результат, используя:
print(np.convolve([10**10], [ 10**8]))
что дает мне 1000000000000000000
в то время как когда я делаю:
print(np.convolve([10], [ 10**9]))
Я снова получаю глупый результат, например 1410065408, а не 10 в степени 10. Похоже, что каждый раз, когда есть 10 в степени 9, я получаю странные результаты.
Спасибо
Ответ №1:
Обратите 10**9
внимание, что это целое число , которое в numpy интерпретируется как int32
32-разрядное целое число. Максимальное значение , которое может быть представлено в этом типе 2147483647
, заключается в том, что если вы идете медленнее, чем это, вы получаете переполнение. Если вы хотите использовать целочисленные типы, используйте np.int64
вместо этого, в противном случае используйте числа с плавающей запятой, например np.float
:
np.convolve(np.array([10**9], dtype=np.int64), np.array([10**9], dtype=np.int64))
Комментарии:
1. Спасибо. Тогда почему это работает с 10**10? И как я могу это исправить?
2. Если вы используете
10**10
его, он будет создаватьint64
массивы с самого начала. Попробуйте сами: выведитеnp.array([x]).dtype
для различных значенийx
. Также ознакомьтесь с документацией: numpy.org/doc/stable/user/basics.types.html