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

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

19.09.2013, 11:08. Показов 2183. Ответов 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
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 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
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
19.09.2013, 12:02
Цитата Сообщение от vladislav23 Посмотреть сообщение
В задании указано проверять точность по этой формуле
По той которая написанна у вас?
0
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 24
19.09.2013, 12:09  [ТС]
Да.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 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
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 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
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
19.09.2013, 12:29
Catstail, благодрю за информацию, но вы не поняли о чем идет речь.
Разность членов гармонического ряда стремиться к нулю, однако сам ряд не сходится, поэтому формула которой пользуется vladislav23 не даст правильно результата. Т.е. он пользуется неправильной формулой для оценки остатка.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 14
19.09.2013, 12:30
PS
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 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
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 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
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 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
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru