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

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

Войти
Регистрация
Восстановить пароль
 
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 691
#1

Сравнение функций - C++

01.12.2013, 21:53. Просмотров 312. Ответов 7
Метки нет (Все метки)

Здравствуйте. Прошу помощи т.к. зашел в тупик.
Задача: Требуется написать программу которая вычисляла тригонометрическую функцию двумя путями: с использованием математических функций math.h и разложением тригонометрической функции в ряд, а затем сравнить результаты вычислений с некоторой точностью эпсилон.. К сожалению не получается реализовать функцию по разложению в ряд.

Формула разложения котангенса

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include<iostream>
#include<conio.h>
#include<math.h>
void stopping();
double seq_ctg(double,double);
double mpow(double , double);
double fact(double);
using namespace std;
const double PI=3.14;
const long N=12;
int main()
{
setlocale(LC_ALL,"Rus");
double eps, xs,xe,dx,xi, myctg, cctg,delta; 
cout<<"Введите E --> ";
cin>>eps;
cout<<"Введите X start --> ";
cin>>xs;
cout<<"Введите X end --> ";
cin>>xe;
cout<<"Введите DX --> ";
cin>>dx;
if(dx<=0||xs>=xe)
stopping();
printf("|-----------------|-------------------|-----------------|-------------------|\n");
printf("|        X        |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
printf("|-----------------|-------------------|-----------------|-------------------|\n");
for( ;xs<=xe;xs=xs+dx)
{  
   if(xs/PI!=1)
   {
   cctg=cos(xs)/sin(xs);
   myctg=seq_ctg(xs,eps);
   delta=sqrt(abs(myctg*myctg-cctg*cctg));
   printf("|    %10.6f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",xs,myctg,cctg,delta);
   }
   else 
   {
       printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 
   }
}
printf("|-----------------|-------------------|-------------------------------------|\n");
cout<<"Введите X ideal --> ";
 cin>>xi;
 eps=0.1;
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 printf("|    Epsilon      |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 for( ;eps>0.0000001;eps=eps/10)
{
    
      
      if(xs/PI!=1)
      {
            myctg=seq_ctg(xi,eps);
            cctg=cos(xi)/sin(xi);
            delta=sqrt(abs(myctg*myctg-cctg*cctg));
            printf("|    %10.7f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",eps,myctg,cctg,delta);
       }
else
    printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 }
    printf("|-----------------|-------------------|-------------------------------------|\n");
 
 
cin.get();
cin.get();
return 0;
}
 
 double seq_ctg(double xs, double eps)
 {int n=0;
 double prov,rezult=0;
 do
 {prov=rezult;
 rezult=rezult+((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n));
 n++;
 }
 while(abs(rezult-prov)>=eps);
 return prov/xs;
 }
 
 
 
 double fact(double x)
{
    if (x<=1) return 1;
    else return x*fact(x-1);
}
 
 double mpow(double x, double y)
{
    double r = 1;
    while((y--)>0) r*=x;
    return r;
}
 
void stopping()
   {
cout<<"Ошибка";
cin.get();
cin.get();
exit(0);
   }
Библиотечная и рядная функции слишком намного отличаются.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2013, 21:53     Сравнение функций
Посмотрите здесь:

Сравнение работы функций - C++
Здравствуйте! Дана такая задача - есть функция, в моём случае sin(x) / x, дано её разложение в ряд. Задание состоит в том, чтобы...

Организовать арифметику класса ( сложение вычитание и сравнение) в виде именованных функций, сохраняющих результат в объекте «this» - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; class String { private: char*...

Сравнение C++ с С# - C++
Какие существенные достоинства и недостатки C++ есть по сравнению с C# ?

Сравнение скорости - C++
вечер добрый. смотрел задачи на codeforces, и заметил, что 90% решений на с++ написано в таком стиле, код взят случайный - #include...

Сравнение чисел - C++
Есть у меня 2 числа: 3.1000000000000017 и 3.1000000000000000 Они как бы равны, но не получается их в блоке if сравнить. Как их...

Сравнение объектов - C++
if ((a/b) &gt; (f.a/f.b)) { cout &lt;&lt; &quot;1 &gt; 2&quot; &lt;&lt; endl; return *this; объекты класса a и b имеют тип int, как в этом отрывке метода...

Сравнение строк - C++
Написать программу, которая сравнивает строки не использую стандартную функцию strncmp. При чем рассматривается только kol-size_t maxlen...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
01.12.2013, 23:40     Сравнение функций #2
parkito, в формуле указано что модуль x должен быть меньше Пи. Я не увидел у Вас этого условия в программе. Условие
C++
1
if(xs/PI!=1)
еще не говорит о том, что x меньше, он может быть и больше и частное в этом случае тоже не будет равно 1. Это так на вскидку.
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
01.12.2013, 23:43     Сравнение функций #3
Цитата Сообщение от parkito Посмотреть сообщение
if(xs/PI!=1)
Нельзя так сравнивать вещественные числа в принципе, т.к. представление не точное; должно быть что-нибудь вроде
C++
1
if (std::abs(xs / PI - 1) > eps)
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 691
01.12.2013, 23:46  [ТС]     Сравнение функций #4
Тем не менее, даже если я жестко задаю условие
C++
1
if(abs(xs)<PI&&xs!=0)
Не работает корректно
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include<iostream>
#include<conio.h>
#include<math.h>
void stopping();
double seq_ctg(double,double);
double mpow(double , double);
double fact(double);
using namespace std;
const double PI=3.14;
const long N=12;
int main()
{
setlocale(LC_ALL,"Rus");
double eps, xs,xe,dx,xi, myctg, cctg,delta; 
cout<<"Введите E --> ";
cin>>eps;
cout<<"Введите X start --> ";
cin>>xs;
cout<<"Введите X end --> ";
cin>>xe;
cout<<"Введите DX --> ";
cin>>dx;
if(dx<=0||xs>=xe)
stopping();
printf("|-----------------|-------------------|-----------------|-------------------|\n");
printf("|        X        |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
printf("|-----------------|-------------------|-----------------|-------------------|\n");
for( ;xs<=xe;xs=xs+dx)
{  
   if(abs(xs)<PI&&xs!=0)
   {
   cctg=cos(xs)/sin(xs);
   myctg=seq_ctg(xs,eps);
   delta=sqrt(abs(myctg*myctg-cctg*cctg));
   printf("|    %10.6f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",xs,myctg,cctg,delta);
   }
   else 
   {
       printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 
   }
}
printf("|-----------------|-------------------|-------------------------------------|\n");
cout<<"Введите X ideal --> ";
 cin>>xi;
 eps=0.1;
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 printf("|    Epsilon      |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 for( ;eps>0.0000001;eps=eps/10)
{
    
      
      if(abs(xs)<PI&&xs!=0)
      {
            myctg=seq_ctg(xi,eps);
            cctg=cos(xi)/sin(xi);
            delta=sqrt(abs(myctg*myctg-cctg*cctg));
            printf("|    %10.7f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",eps,myctg,cctg,delta);
       }
else
    printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 }
    printf("|-----------------|-------------------|-------------------------------------|\n");
 
 
cin.get();
cin.get();
return 0;
}
 
 double seq_ctg(double xs, double eps)
 {int n=0;
 double prov,rezult=0;
 do
 {prov=rezult;
 rezult=rezult+((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n));
 n++;
 }
 while(abs(rezult-prov)>=eps);
 return prov/xs;
 }
 
 
 
 double fact(double x)
{
    if (x<=1) return 1;
    else return x*fact(x-1);
}
 
 double mpow(double x, double y)
{
    double r = 1;
    while((y--)>0) r*=x;
    return r;
}
 
void stopping()
   {
cout<<"Ошибка";
cin.get();
cin.get();
exit(0);
   }
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
01.12.2013, 23:52     Сравнение функций #5
Цитата Сообщение от parkito Посмотреть сообщение
xs!=0
Ещё раз скажу, что так нельзя; там, где по логике должен быть 0, его вполне может не быть, а будет какое то близкое число, например 0.00000001 .
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 691
01.12.2013, 23:57  [ТС]     Сравнение функций #6
Хорошо. А что по работе функции ?
C++
1
seq_ctg
nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
02.12.2013, 00:02     Сравнение функций #7
parkito, вот здесь
C++
1
2
3
4
5
6
do
{
    prov=rezult;
    rezult=rezult+((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n));
    n++;
}while(abs(rezult-prov)>=eps);
разность может быть меньше введенного вами эпсилон, но результат будет сильно отличаться от котангенса. Я бы сравнивал разность котангенса из math.h и полученного вами значения. Если использовать ваши обозначения, то:
C++
1
2
3
4
5
do
{
    rezult+=((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n));
    n++;
}while(eps <= abs(rezult - cctg));
Как-нибудь так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 00:11     Сравнение функций
Еще ссылки по теме:

Сравнение посимвольно - C++
Добрый день, стоит такая задача: Даны две строки. Определите, совпадают ли они сравнив их посимвольно. Напишите для этого функцию bool...

Сравнение строк - C++
Напишите программу, которая предлагает пользователю ввести две строки, а затем сравнивает их, игнорируя &quot;регистровые&quot; различия, т.е....

Посимвольное сравнение - C++
Не могу понять что я делаю не так, объясните пожалуйста. #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void...

Сравнение строк - C++
Добрый вечер. Пользователь должен ввести слово которое находиться в инструкции if и ему должно показать что ответ верный. Но почему то...

Сравнение чисел. - C++
Вообщем нужно ввести с клавы 3 числа. Нужно чтобы прога вывела их в порядке max, min, middle. В голову кроме if(max&lt;min){}ничего не...


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

Или воспользуйтесь поиском по форуму:
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 691
02.12.2013, 00:11  [ТС]     Сравнение функций #8
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include<iostream>
#include<conio.h>
#include<math.h>
void stopping();
double seq_ctg(double,double,double);
double mpow(double , double);
double fact(double);
using namespace std;
const double PI=3.14;
const long N=12;
int main()
{
setlocale(LC_ALL,"Rus");
double eps, xs,xe,dx,xi, myctg, cctg,delta; 
cout<<"Введите E --> ";
cin>>eps;
cout<<"Введите X start --> ";
cin>>xs;
cout<<"Введите X end --> ";
cin>>xe;
cout<<"Введите DX --> ";
cin>>dx;
if(dx<=0||xs>=xe)
stopping();
printf("|-----------------|-------------------|-----------------|-------------------|\n");
printf("|        X        |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
printf("|-----------------|-------------------|-----------------|-------------------|\n");
for( ;xs<=xe;xs=xs+dx)
{  
   if(abs(xs)<PI&&xs!=0)
   {
   cctg=cos(xs)/sin(xs);
   myctg=seq_ctg(xs,eps,cctg);
   delta=sqrt(abs(myctg*myctg-cctg*cctg));
   printf("|    %10.6f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",xs,myctg,cctg,delta);
   }
   else 
   {
       printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 
   }
}
printf("|-----------------|-------------------|-------------------------------------|\n");
cout<<"Введите X ideal --> ";
 cin>>xi;
 eps=0.1;
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 printf("|    Epsilon      |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 for( ;eps>0.0000001;eps=eps/10)
{
    
      
      if(abs(xs)<PI&&xs!=0)
      {
            myctg=seq_ctg(xi,eps,cctg);
            cctg=cos(xi)/sin(xi);
            delta=sqrt(abs(myctg*myctg-cctg*cctg));
            printf("|    %10.7f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",eps,myctg,cctg,delta);
       }
else
    printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 }
    printf("|-----------------|-------------------|-------------------------------------|\n");
 
 
cin.get();
cin.get();
return 0;
}
 
 double seq_ctg(double xs, double eps, double cctg)
 {int n=0;
 double prov,rezult=0;
 do
{
    rezult+=((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n))/xs;
    n++;
 }while(eps <= abs(rezult - cctg));
 return rezult;
 }
 
 
 
 double fact(double x)
{
    if (x<=1) return 1;
    else return x*fact(x-1);
}
 
 double mpow(double x, double y)
{
    double r = 1;
    while((y--)>0) r*=x;
    return r;
}
 
void stopping()
   {
cout<<"Ошибка";
cin.get();
cin.get();
exit(0);
   }
Не работает.
Для остановки счета нужно использовать погрешность епсилон. В противном случае смысл программы меняется.
Yandex
Объявления
02.12.2013, 00:11     Сравнение функций
Ответ Создать тему
Опции темы

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