Оценка суммы Римана

Я пытаюсь вычислить значение n, которое решает проблему ниже. Я не совсем уверен, где я испортил. Я также пытался использовать цикл do while, но у меня возникли проблемы с определением логической ошибки. Может ли кто-нибудь помочь?

Если S = ​​√ (6*( 1+1/2^2+1/3^2 +1/4^2 + 1/5^2 + ... )) = (pi^2)/6, после того, как во многих терминах сумма будет равна PI с точностью до 6 знаков после запятой. PI с точностью до 6 знаков после запятой равно 3,141592. Соответствующая часть моего кода показана ниже:

    double s = 0;


    for(int n=1;abs(sqrt(6*s) - 3.141592) >= pow(10,-6);n++) {

        s += (1/(pow(n,2)));

            NSLog(@"%i",n);

    }

person user3525783    schedule 21.05.2014    source источник
comment
Дважды проверьте, что такое s на каждом шаге. 1/(...) может привести к целому числу, поэтому вам может понадобиться 1.0/(...) в качестве предположения.   -  person Josh B    schedule 21.05.2014
comment
Число Пи с точностью до 6 знаков после запятой не равно 3,141592. Это 3.141593.   -  person The Paramagnetic Croissant    schedule 21.05.2014
comment
Спасибо, Джош Б., похоже, это не сработало. Кроме того, пользователь, спасибо за исправление, хотя это незначительная проблема (я не слишком беспокоюсь о том, что ошибся +/- 1 или около того.   -  person user3525783    schedule 21.05.2014


Ответы (1)


int abs(int i)

вычисляет абсолютное значение целого числа. Поэтому в

abs(sqrt(6*s) - 3.141592)

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

Вместо этого вы хотите использовать fabs().

person Martin R    schedule 21.05.2014
comment
Это довольно интересно. Спасибо, хотя я не уверен, что переход на fabs дал правильный ответ. - person user3525783; 21.05.2014
comment
@ user3525783: Какой ответ вы получили перед модификацией? Какой ответ вы получили сейчас и какой ответ вы считаете правильным? Обратите внимание, что ошибки округления также могут играть роль. - person Martin R; 21.05.2014
comment
Ну, он просто продолжает печатать до 300 000 и продолжает работать. Я почти уверен, что это не должно продолжаться так долго. - person user3525783; 21.05.2014
comment
@ user3525783: В моем тесте останавливается на 577490. Обратите внимание, что вы можете улучшить производительность, 1) вычислив pow(10,-6) заранее и 2) удалив NSLog() внутри цикла. - person Martin R; 21.05.2014
comment
Хм, у меня пробег перевалил за 600 000. Я перезапущу его с помощью fabs(sqrt(6*s) - 3.141592). До того, как я сделал это с помощью fabs(sqrt(6*s) - 3.141593) - person user3525783; 21.05.2014
comment
На самом деле вы должны проверить значение fabs(sqrt(6*s) - M_PI). В этом приведении он останавливается на 954931. - person Martin R; 21.05.2014
comment
Он снова преодолел отметку в 600 000. Вот последний код: pastie.org/9194846 - person user3525783; 21.05.2014
comment
Ну, m_pi здесь нам не нужен. Мы знаем, что такое число пи с точностью до 6 знаков после запятой. Это 3.141592 (или также можно использовать 3.141593) - person user3525783; 21.05.2014
comment
Вы получили результат за 0,02 секунды? Это невероятно. У меня уходит около минуты (часы у меня не настроены, но точно не меньше секунды) - person user3525783; 21.05.2014
comment
Давайте продолжим обсуждение в чате. - person Martin R; 21.05.2014