Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
vladislav23
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 24
#1

При больших значениях х ряд считает направильно - C++

19.09.2013, 11:08. Просмотров 712. Ответов 23
Метки нет (Все метки)

При больших значениях х ряд считает направильно с чем это может быть связано, вот код и сам ряд:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
   double result=1;
   long int j=2;
   bool minus=true;
   double cur=x;
   double prev=0;
   double f=0;
   do
   {
      cur=pow(x,j);
      
      if (minus)
      {
         cur=cur*(-1.0);
      }
      f=1.0;
      for (long int i=1;i<=j;i++)
      {
         f=f*i;
      }
      cur=cur/f;
      result=result+cur;
      double testval=fabs(prev)-fabs(cur);
      if (j>2&&testval<=e)
      {
         break;
      }
      
      minus=!minus;
      prev=cur;
      j+=2;
   } while (1);
   return result; 
}
0
Изображения
 
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 11:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При больших значениях х ряд считает направильно (C++):

Вывести на экран дисплея сообщения о значениях функции при различных значениях аргумента - C++
помогите пожалуйста.. Разработать программу, которая выводит на экран дисплея сообщения о значениях функции при различных значениях...

Разложение в ряд. Не правильно считает - C++
Программа высчитывает значение функции и значение этой функции через ряд в данной точке. Вроде все высчитывается. Но при х&gt;6 ну или где...

Разложение в ряд Тейлора (неверно считает) - C++
Задача: Вычислить и вывести на экран в виде таблицы значения функции F(x) на интервале с шагом dx с точностью до Eps. Каждая строка...

Почему при матрице 19х19 считает, а при 20х20 вылетает? - C++
Здравствуйте, искал решение задачи коммивояжера полным перебором нашел тут: ...

Найти значение х и у при заданных значениях a и b: - C++
Найти значение х и у при заданных значениях a и b:

Вычисление значения y при разных значениях a и b - C++
Только начал изучать c++ помогите с программой

23
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 13:15 #16
Цитата Сообщение от Ilot Посмотреть сообщение
Nekto, Catstail все таки прав нужно знать как оценивать ошибки, а не использовать оч. большие числа в надежде, что ошибка скроется где-то в глубине после запятой.
При больших x всего-то навсего следует пользоваться формулами приведения к стандартному отрезку [-pi, pi]. Мотайте на ус. И не нужно вам ни каких long long.
Я не проводил анализ, как быстро оно будет сходиться.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.09.2013, 13:23 #17
Цитата Сообщение от Nekto Посмотреть сообщение
Я не проводил анализ, как быстро оно будет сходиться.
При такой оценке оно вообще может не сходится. Рекомендую прочитать посты выше.
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 13:42 #18
Цитата Сообщение от Ilot Посмотреть сообщение
При такой оценке оно вообще может не сходится. Рекомендую прочитать посты выше.
Есть картинка с формулой, которую надо реализовать. Остальные ограничения, что это именно косинус, а не просто любая функция с именем cos, и поэтому можно уменьшать х без потери результата, это уже дополнительный анализ, чего в стартовом посте не было.
0
Catstail
Модератор
22732 / 11101 / 1797
Регистрация: 12.02.2012
Сообщений: 18,297
19.09.2013, 14:06 #19
Цитата Сообщение от Nekto Посмотреть сообщение
И терять точность, начиная с определенного этапа.
- и как ты на long long int вычислишь x/n! ?
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
19.09.2013, 14:31 #20
заменить это
Цитата Сообщение от vladislav23 Посмотреть сообщение
testval=fabs(prev)-fabs(cur)
На это
Цитата Сообщение от Nekto Посмотреть сообщение
while (fabs(last - current) > eps
очень здравая мысль, но хватит тут и double.
А вот
Цитата Сообщение от Nekto Посмотреть сообщение
numerator *= x*x;
* * denominator *= step_factorial * (step_factorial - 1);
* * step_factorial += 2;
явно лишнее. Достаточно хранить текущий член ряда, и следующий, и все. Из предыдущего получить следующий путем prev*x*x/((j-1)*j)

Там кода вообще на 10 строчек, а тут целое сочинение пишут...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
  {
  std::cout << "Enter x: ";
  double x;
  std::cin >> x;
  std::cout << "Enter eps: ";
  double eps;
  std::cin >> eps;
  sum = 1;
  double cur, prev = 1;
  for(int i = 2; ; i+=2) {
    prev = cur;
    cur *= -1*x*x/(i*(i-1));
    sum += cur;
    if (abs(abs(cur)-abs(prev))<eps) break;
  }
   cout << summ << endl;
  return 0;
  }
Вот.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.09.2013, 14:37 #21
Цитата Сообщение от monolit Посмотреть сообщение
Там кода вообще на 10 строчек, а тут целое сочинение пишут...
Если бы вы читали, что в посте №3 написанно то увидели бы, что можно ограничиться максимум 3-мя строчками.
И сколько раз вам повторять оценка
C++
1
(abs(abs(cur)-abs(prev))
не правильная.
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
19.09.2013, 14:56 #22
Если не нравится, можете оценивать разность между предыдущей и следующей суммами. Но я всегда пользовался оценкой между членами ряда, и проблем не знал. Он же не в промышленности где программу пишет, в самом деле.
И если eps не будет уж совсем маленьким(очень-очень), то переполнения не возникнем(учитывая, что double 8 байтный, и диапазон его довольно таки немаленький). И уж не с вами ли я спорил насчет ряда Тейлора (и оказался прав)?
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.09.2013, 15:07 #23
Цитата Сообщение от monolit Посмотреть сообщение
И уж не с вами ли я спорил насчет ряда Тейлора (и оказался прав)?
Много чести.
Посуммируйте тогда ряд 1/n. Для него 1/n-1/(n+1)~O(1/n), но ряд расходится. В данном случае эта оценка прокатывает только потому, что ряд фактически представляет собой ряд Лейбница и вы на самом деле имеете завышенную точность вычисления.
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
19.09.2013, 15:18 #24
Но ведь у него ряд не 1/n, верно? Да, можно привести примеры, когда при выполнении условия abs(...) ряд будет расходиться, но врядли такие задачи будут давать по программированию на 1, 2м курсе(скорее 1м), где проверяется отнюдь не умение находить суммы рядов.
0
19.09.2013, 15:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 15:18
Привет! Вот еще темы с ответами:

Вычислить значения функций при различных значениях x - C++
Помогите! Вычислить значения функций y(x) и z(x, y) при различных значениях x. Пожалуйста!)

Вычислить выражение при разных значениях икса - C++
У меня есть программа которая считает выражение при разных значениях икса. Вот программа: #include &lt;iostream&gt; #include &lt;math.h&gt; ...

Разные результаты программы при постоянных входных значениях - C++
Доброго времени суток! Столкнулся с такой проблемой - ввожу одни и те же значения в исходный массив. Запускаю программу - выдает один...

вывод таблицы значений функции y(x) при различных значениях - C++
написать программу на С++ для вывода таблицы значений функции y(x) при различных значениях x. Значения переменной х меняються от a до b с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru