С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 24

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

19.09.2013, 11:08. Показов 2135. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2013, 11:08
Ответы с готовыми решениями:

Bitshift не работает при больших значениях
Скажите пожалуйста, почему я вбиваю bitshift(4,5) % все работает, ans=128 А если второе число(в данном случае &quot;5&quot;)...

Алгоритм поразрядного поиска при некоторых значениях считает в обратную сторону
Доброго времени суток. Прошу помочь разобраться в хитрости алгоритма поразрядного поиска. У меня есть такая функция: 0.01x^3+x^2-5x-5. Ее...

Некорректная работа графика при больших значениях
Собственно программа для построения графика функции (y=(x+a)^3 * (b-a)^(1/3)) и нахождения корней. При маленьких значениях a,b (н-р 1,...

23
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 11:12
C++
1
2
3
4
if (minus)
      {
         cur=cur*(-1.0);
      }
Тут не нужна проверка. Знак меняться должен на каждой итерации.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
19.09.2013, 11:41
Код конечно капец.
Если вот это проверка точности
C++
1
double testval=fabs(prev)-fabs(cur);
То должен вас расстроить ошибку ряда нужно вычислять по остаточным членам, например в форме Лагранжа.
Возможно такой алгоритм подойдет больше?
C++
1
2
3
4
5
6
7
    double xSled = 1.0,//член ряда
 sum = 0.0;//сумма ряда
    do
    {
        sum += xSled;
    }
    while((xSled *= - x * x /(2 * j *(2 * j - 1))) > precision);//проверяем точность
0
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 24
19.09.2013, 11:56  [ТС]
В задании указано проверять точность по этой формуле
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
19.09.2013, 12:02
Цитата Сообщение от vladislav23 Посмотреть сообщение
В задании указано проверять точность по этой формуле
По той которая написанна у вас?
0
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 24
19.09.2013, 12:09  [ТС]
Да.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
19.09.2013, 12:15
Ну тогда получаете то что имеете. Ознакомтесь с этим.
Любой ряд со стремящимися к нулю членами по вашей формуле рано или позно даст сумму с какой-то точность. А теперь рассмотрим например гармонический ряд. Его члены стремяться к нулю, однако сам ряд расходится. Так что выбросьте задачник в топку и подтяните математику.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 12:16
double f=0; - меняй на unsigned long long f;
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4307
Регистрация: 12.02.2012
Сообщений: 34,688
Записей в блоге: 14
19.09.2013, 12:25
Цитата Сообщение от Nekto Посмотреть сообщение
double f=0; - меняй на unsigned long long f;
- ни в коем случае! Только double!

Цитата Сообщение от Ilot Посмотреть сообщение
Так что выбросьте задачник в топку и подтяните математику.
- нет, задачник не виноват. И гармонический ряд здесь не при чем. Виновата машинная математика.

Ряд для косинуса сходится абсолютно при любом вещественном х. Но дело в том, что вещественное число - это зачастую бесконечная дробь, а машинная арифметика работает с длинными, но конечными дробями. Это вызывает т.н. погрешность ограничения. И эта погрешность копится (особенно для рядов типа sin/cos) и, в конце концов, способна исказить результат до полного абсурда. Мало кто из программистов (особенно начинающих) это понимает...

Рекомендую старую, но очень хорошую книгу Мак-******, Дорн "Численные методы и программирование на Фортране". Там этот вопрос хорошо рассмотрен в одной из первых глав.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 12:28
Цитата Сообщение от Catstail Посмотреть сообщение
- ни в коем случае! Только double!
И терять точность, начиная с определенного этапа.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
19.09.2013, 12:29
Catstail, благодрю за информацию, но вы не поняли о чем идет речь.
Разность членов гармонического ряда стремиться к нулю, однако сам ряд не сходится, поэтому формула которой пользуется vladislav23 не даст правильно результата. Т.е. он пользуется неправильной формулой для оценки остатка.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4307
Регистрация: 12.02.2012
Сообщений: 34,688
Записей в блоге: 14
19.09.2013, 12:30
PS
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
19.09.2013, 12:42
Catstail, от души благодаю. Это именно то что мне нужно так как сам собираюсь заниматься именно численными методами. Может еще что-нибудь посоветуете(особенно интересуют ур. в часных производных)?
1
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 12:47
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
#include <iostream>
#include <iomanip>
 
int main()
  {
  std::cout << "Enter x: ";
  long double x;
  std::cin >> x;
  std::cout << "Enter eps: ";
  long double eps;
  std::cin >> eps;
  long double sum = 1;
  long double numerator = 1;
  unsigned long long denominator = 1;
  unsigned long step_factorial = 2;
  long double current = 100500;
  long double sign = 1;
  long double last;
  do
    {
    sign *= -1;
    numerator *= x*x;
    denominator *= step_factorial * (step_factorial - 1);
    step_factorial += 2;
    last = current;
    current = numerator / denominator;
    sum += sign * current;
    }
  while (fabs(last - current) > eps);
  std::cout << "Result = " << std::setprecision(LDBL_DIG) << sum << std::endl;
  std::cin.ignore();
  std::cin.get();
  return 0;
  }
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
19.09.2013, 13:13
Nekto, Catstail все таки прав нужно знать как оценивать ошибки, а не использовать оч. большие числа в надежде, что ошибка скроется где-то в глубине после запятой.
При больших x всего-то навсего следует пользоваться формулами приведения к стандартному отрезку [-pi, pi]. Мотайте на ус. И не нужно вам ни каких long long.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 13:15
Цитата Сообщение от Ilot Посмотреть сообщение
Nekto, Catstail все таки прав нужно знать как оценивать ошибки, а не использовать оч. большие числа в надежде, что ошибка скроется где-то в глубине после запятой.
При больших x всего-то навсего следует пользоваться формулами приведения к стандартному отрезку [-pi, pi]. Мотайте на ус. И не нужно вам ни каких long long.
Я не проводил анализ, как быстро оно будет сходиться.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
19.09.2013, 13:23
Цитата Сообщение от Nekto Посмотреть сообщение
Я не проводил анализ, как быстро оно будет сходиться.
При такой оценке оно вообще может не сходится. Рекомендую прочитать посты выше.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 13:42
Цитата Сообщение от Ilot Посмотреть сообщение
При такой оценке оно вообще может не сходится. Рекомендую прочитать посты выше.
Есть картинка с формулой, которую надо реализовать. Остальные ограничения, что это именно косинус, а не просто любая функция с именем cos, и поэтому можно уменьшать х без потери результата, это уже дополнительный анализ, чего в стартовом посте не было.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4307
Регистрация: 12.02.2012
Сообщений: 34,688
Записей в блоге: 14
19.09.2013, 14:06
Цитата Сообщение от Nekto Посмотреть сообщение
И терять точность, начиная с определенного этапа.
- и как ты на long long int вычислишь x/n! ?
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
19.09.2013, 14:31
заменить это
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2013, 14:31
Помогаю со студенческими работами здесь

Деление с остатком и без. При больших значениях делит не правильно
Здравствуйте имеем такую задачу: Присвоить целой переменной k третью от конца цифру в записи положительного целого числа n....

Как ведет себя график при очень больших значениях ординат?
Подскажите пожалуйста, возможно ли в маткаде или матлабе увидеть, как ведет себя график при очень больших значениях ординат, порядка 10 в...

Почему при больших значениях напряжений на катушке и конденсаторе уравнивается Напряжение на выходе
Задали вот такой вопрос, не знаю как правильно ответить. Помогите пожалуйста, спасибо! Добавлено через 26 минут На входе*(полное...

Вычислить значения переменной y, где при четных значениях x; y=x2 – 6 при значениях x, кратных 5; y=0 во всех остальных случаях
Составьте программу, предназначенную для вычисления значения переменной y, где при четных значениях x; y=x2 – 6 при значениях x,...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru