Путать с функцией sqrt () в C - PullRequest
2 голосов
/ 14 марта 2011

Когда мне это нравится, это хорошо работает в моем коде ...

...

for (i = 2; i <= sqrt(500000); i++)

...

Но мне нравится

for (i = 2; i < sqrt(500000) + 1; i++)

выполняется после компиляции, возникает ошибка, сообщающая Segmentation fault (core dumped).

for loop body:

for (i = 2; i <= sqrt(500000); i++) {
        summation[i * i] += i;
        for (j = i + 1; j <= 500000 / i; j++) {
            summation[i * j] += (i + j);
        }
    }

Есть ли разница между двумя циклами for? Спасибо

Ответы [ 5 ]

8 голосов
/ 14 марта 2011

Ваш второй цикл запускается еще раз: 500000 не является идеальным квадратом, поэтому i < sqrt(500000) и i <= sqrt(500000) всегда равны, а +1 обеспечивает еще одну итерацию.

3 голосов
/ 14 марта 2011

sqrt() вернет число с плавающей запятой, поэтому все сравнения сделаны для чисел с плавающей запятой, и они неточны по конструкции, поэтому эти два сравнения выше могут дать разные результаты и, таким образом, в одном изслучаев вы будете иметь однозначное и неопределенное поведение.

1 голос
/ 14 марта 2011

Как уже объяснили другие, + 1 заставляет цикл повторяться слишком часто.Затем доступ summation[i * i] или summation[i * j] выходит за пределы выделенного размера summation.Решение состоит в том, чтобы либо соответствующим образом увеличить выделенный размер, либо убедиться, что условие корректно (не выполняется + 1), и, таким образом, вы не запускаете конец массива.

Но также, как и другие, ужеСказал, что вы не должны использовать значение с плавающей запятой (результат sqrt) с целочисленным сравнением, так как значения с плавающей запятой ... сложно.Я не уверен, будет ли в этом случае int приведен к плавающей или наоборот, но в любом случае это не правильно.

1 голос
/ 14 марта 2011

Я попробовал ваш код с gcc 4.3.4 под cygwin.

  • В первом случае я повторяю до 707.
  • Во втором случае я повторяюдо 708.

Могу поспорить, что это последнее значение вызывает переполнение буфера где-то в теле цикла.

0 голосов
/ 14 марта 2011

вы пробовали это?

for (i = 2; i < (sqrt(500000) + 1); i++)

Является ли ваша переменная плавающего pont?

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