Cython разные результаты

1

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

так хм, так что не так, ребята

  • 1
    Вам не нужно инициализировать результат, прежде чем начать добавлять к нему?
  • 0
    да, спасибо, что дал мне знать, я думал, что по умолчанию 0
Теги:
cython

2 ответа

3
Лучший ответ

Здесь, вероятно, есть две проблемы. Во-первых, результат должен быть обнулен. Во-вторых, результатом является сумма всех целых чисел в квадрате от 0 до 50 000 (не включительно)

Изображение 174551

Проблема в том, что тип хранения int не может вместить такое большое число. Попробуйте использовать больший тип хранилища, например long long и он будет работать. Максимальное значение, которое может содержать 32-разрядное целое число, составляет примерно 2 ^ 31. Максимальное значение, которое может содержать long long, обычно составляет 2 ^ 63. Проконсультируйтесь с компилятором C в имеющейся системе, чтобы выяснить точные пределы.

  • 1
    Хороший вопрос, но это не объясняет, почему функция «возвращает разные результаты для каждого запуска».
  • 0
    Я включил ваш комментарий. Спасибо, что поймали это.
Показать ещё 7 комментариев
0

Оператор 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню