C/C++

Помогите написать программу на СИ

Вычислить бесконечную сумму с заданной точностью, используя рекуррентные зависимости
Rustam Turdiev
Rustam Turdiev
435
 double x, q, t, s;
int n = 1;
scanf("%lf", &x);
s = t = x;
q = -x * x;
do {
n += 2;
t *= q / (n * (n - 1));
s += t;
} while(fabs(t) >= 1.0e-5);
printf("%.8f %.8f\n", s, sin(x));
Анатолий Симонов
Анатолий Симонов
76 653
Лучший ответ
Rustam Turdiev Спасибо
Если уж вычисляется синус, то тут есть два подхода: 1) воспользоваться тригонометрической формулой приведения для достаточно больших по модулю аргументах синуса sin(x+2πk)=sin(x) для любого k∈ℤ, 2) наплевать на формулу приведения. Запустим следующий код и проверим что получается в обоих случаях:
#include <math.h>
#include <stdio.h>
int main()
{
const double e = 1., ε = 1e-5,
τ = 6.2831853071795865;
double x, X, y, p, q, s, sx;
for (;;)
{
printf("x = ");
scanf("%lf", &x);
X = x;
sx = sin(x);
x -= τ * (long long)(x / τ);
p = s = x;
y = - x * x;
q = e;
while (fabs(p) > ε)
{
q += 2.;
p *= y / (q * (q - e));
s += p;
}
printf("sin(x) = %.16g\n1) %.16g %.4e\n",
sx, s, s - sx);
p = s = X;
y = - X * X;
q = e;
while (fabs(p) > ε)
{
q += 2.;
p *= y / (q * (q - e));
s += p;
}
printf("2) %.16g %.4e\n", s, s - sx);
}
}
А результаты такие:Видно, что без формулы приведения можно вычислять синус только где-то до |х|≈20..25, а дальше возникают гигантские погрешности, причём при х=800 программа вообще зависает напрочь. С формулой же приведения можно вычислять синус хоть даже при аргументе в сто миллиардов и при этом ничего, естественно, не зависает...