Другие языки программирования и технологии

Почему считает всего несколько раз, не проходит все елементьі последовательности от a1 до a2 с шагом dx. Ряд тейлора C++?

Когда ввожу от 1 до 10 с шагом 1, оно считает лишь 2 раза.
Задание - ряд тейлора, разложение arctg(x)
#include "stdafx.h"

#include "conio.h"

#include <iostream>

#include "stdio.h"

#include "math.h"

using namespace std;

int main()

{

int n, k, i;

double const pi = 3.1415926;

double xn, xk, dx, E = 1e-5, s, x, P, Fun;

cout << "xn = ";

cin >> xn;

cout << "xk = ";

cin >> xk;

cout << "dx = ";

cin >> dx;

cout << "__________________________________________________________" << endl;

cout << "| x | F | kolіatan(x) |" << endl;

cout << "__________________________________________________________" << endl;

x = xn;

while (x <= xk)

{

k = 0;

s = pi / 2;

n = 0;

P = (pow(-1, n + 1) / (2 * n + 1)*(pow(x, 2 * n + 1)));

while (fabs(P)>E)

{

P = (pow(-1, n + 1) / (2 * n + 1)*(pow(x, 2 * n + 1)));

k = k + 1;

n = n + 1;

s = s - P;

}

Fun = atan(x);

printf("%f|\t%f|\t%d|\t\t%f|\t\n", x, s, k, Fun);

x = x + dx;

}

cout << "___________________________________________________________" << endl;

_getche();

return 0;

}
Много мусора в коде - сложно отслеживать запятые за наворотами алгоритма

выкидывая лишнее и впустую вычисляемое, тут-же выкидываемое, в ядре у тя вроде бы такое

------

for(x=xn; x<=xk;x+=dx){ //Тут заменено вайл на фор -так короче и четче
s=pi/2;
double xstep=x; // для pow

n=0;
//Предцикловые выкидываемые вычисления P и лишнее k отброшены
while(P= ((n^0x1)?(xstep ):(-xstep))/(2*n+1) , fabs( P) > E){ //степень единицы взята просто через чётность

s-=P;
xstep*=x*x;//Это вместо pow(x,2n+1), чтоб и тут лишний раз степень не гонять
n++;
}
printf("%f|\t%f|\t%d|\t\t%f|\t\n", x, s, n, atan(x));//это в стиле С а не С++, в плюсах вывод обычно через ">>"

}
-------

насколько так вычисляемое отличается от арктангенса -лень вспоминать его разложение - тут уж самостоятельно))
Mikhail Verbitskiy
Mikhail Verbitskiy
27 060
Лучший ответ
Нужно бы было указать в чём программу пишите. В Borland C++ Builder 3(6), что ли? Мой вариант в Visual C++ 2013.

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
double arctg(double, double = 1e-5);
double set_argument(string = " x: ");
double get_member(double);
void sign(double&);
int main() {
double x = set_argument();
cout << " arctg(" << x << ") = " << fixed << setprecision(5) << arctg(x) << endl;
cout.unsetf(ios::fixed);
cout << " atan(" << x << ") = " << fixed << atan(x) << endl;
cin.get(); cin.get();
return 0;
}
double set_argument(string msg) {
double value;
do {
cout << msg;
cin >> value;
if (cin.good() && value < 1) return value;
else {
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "\aError!\n";
}
} while (true);
return value;
}
double arctg(double value, double eps) {
double prev, cur = 0, result = 0;
do {
prev = cur;
cur = get_member(value);
result += cur;
} while (fabs(fabs(prev) - fabs(cur)) > eps);
return result;
}
double get_member(double value) {
static short n = 1;
static short count = 0;
double member = pow(value, n) / n;
if (count & 1) sign(member);
n += 2;
++count;
return member;
}
void sign(double& value) { value *= -1; }
Георгий Власов
Георгий Власов
82 640
Владимир Константинов Хороший вариант, но увьі - рамки другие у меня да и часть из етого мьі даже не учили. Результат оно проавильньій вьідает кроме, нескольких маленьких деталей - оно не вьідает все вариантьі при x от 1 до 10 с шагом 1, вьідает лишь при х=1 а так же количество шагов оно не правильн осчитает (