fffhey ребята, может кто-нибудь, пожалуйста, будьте так добры и объясните мне, почему эта функция в Cython возвращает разные результаты для каждого запуска?
Я сдал в 50000 на тест
cpdef int fun1(int num):
cpdef int result
cdef int x
for x in range(num):
result += x*x
return result
редактировать: так что теперь я изменил его на длинный длинный результат, как это
cpdef long long fun1(int num):
cdef long long result = 0
cdef int x = 0
for x in range(num):
result += x*x
return result
и он возвращает 25950131338936 но :) функция Python
def pyfunc(num):
result = 0
for x in range(num):
result += x * x
return result
возврат 41665416675000
так хм, так что не так, ребята
Здесь, вероятно, есть две проблемы. Во-первых, результат должен быть обнулен. Во-вторых, результатом является сумма всех целых чисел в квадрате от 0 до 50 000 (не включительно)
Проблема в том, что тип хранения int
не может вместить такое большое число. Попробуйте использовать больший тип хранилища, например long long
и он будет работать. Максимальное значение, которое может содержать 32-разрядное целое число, составляет примерно 2 ^ 31. Максимальное значение, которое может содержать long long
, обычно составляет 2 ^ 63. Проконсультируйтесь с компилятором C в имеющейся системе, чтобы выяснить точные пределы.
Оператор cdef используется для объявления переменных C, локальных или на уровне модуля.
Поэтому вам нужно установить начальное значение для переменной result
. Если вы этого не сделаете, он получит то, что обнаружил в памяти во время вызова, что может быть чем угодно.
cpdef int fun1(int num):
cdef int result = 0
cdef int x
for x in range(num):
result += x * x
return result