Погрешность при вычислении синуса - C (СИ)

Узнай цену своей работы

Формулировка задачи:

вот исходный код программы(вычисляет синус через многочлен Тейлора):
#include <stdio.h>
#include <stdlib.h>
#define PI 3.14159265358979323846

int factorial (int n){
   int i, res;
   if (n<=1){
       res=1;
   }
   else{ 
       res=factorial(n-1)*n;
   }      
   return(res);
}
 
float radians(int deg){
    float rad;
    rad = deg * PI/180;
    return(rad);
}
 
float degree (float x, int n) {
    float res;
    if (n<=1){
        res=x;
    }
    else {
        res=degree(x, n-1)*x;
    }
    return (res);
}
 
float sinus (float x){
   int i, sign, fac;
   float rad, t, res;
   t=radians(x);
   res=0;
   sign=1;
   for (i=1; i<=30; i++){
       if (i%2 != 0){
         res+=sign*(degree(t, i) / factorial(i));
         sign=1-sign?1:-1;
       }
   }
   return (res);
}
 
int main() {
    int i;
    for (i=30; i<=90; i++){
        printf("sinus %d = %.7f\n", i, sinus(i));
    }
    return (EXIT_SUCCESS);
}
sin90=0.9994085, отличие конечно небольшое но все таки... помогите найти погрешность?

Решение задачи: «Погрешность при вычислении синуса»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
 
//Ïðîòîòèï ГЅГІГ*ëëîГ*îé ГґГіГ*êöèè ïîëüçîâГ*òåëÿ
//âîçâðГ*Г№Г*åìîå Г§Г*Г*Г·ГҐГ*ГЁГҐ - Г§Г*Г*Г·ГҐГ*ГЁГҐ ch(x) Гў òî÷êå Гµ
double Y(double x)
{
        return sin(x);
}
 
//ÔóГ*êöèÿ âîçâðГ*Г№Г*ГҐГІ Г§Г*Г*Г·ГҐГ*ГЁГҐ ñóììû ðÿäГ* x^2k/(2*k)!
//Г°Г*Г±Г±Г·ГЁГІГ*Г*Г*îå Г± îòГ*îñèòåëüГ*îé ïîãðåøГ*îñòüþ e
double S(double x)
{
        double ak = x, sum = 0;
        long k = 0;
        //ÄåëГ*ГҐГ¬ ГўГ*ГёГҐ Г°Г*çëîæåГ*ГЁГҐ Г± 30-Гѕ ÷ëåГ*Г*ìè
        while(k <= 30)
        {
                sum += ak;
                ak  *= (-1.0)*pow(x,2)/(2*k + 2);
                //(-1)*pow(x,2)/(2*k + 2) - Г*Г*Гё ГЁГІГҐГ°Г*òîð
                //ГЄГ*ГЄ âèäèì ГҐГЈГ® Г§Г*Г*Г·ГҐГ*ГЁГҐ Г§Г*ГўГЁГ±ГІ îò k, 
                //Г*Г® Г°Г*Г±Г·ВёГІГ*Г*Гї ôîðìóëГ* ïîçâîëÿåò îáîéòèñü ГЎГҐГ§ âîçâåäåГ*ГЁГї
                //Гў Г±ГІГҐГЇГҐГ*Гј 2*k ГЁ èñêëþ÷èòü îïåðГ*öèþ Г*Г*õîæäåГ*ГЁГї ГґГ*êòîðèГ*Г«Г*
                k++;
        }
        return sum;
}
 
int main()
{
        double e = 0, x = 0;
        while(1)//ÄåëГ*Гѕ ГЎГҐГ±ГЄГ®Г*ГҐГ·Г*ûé ââîä
                //äëÿ Г§Г*âåðøåГ*ГЁГї Г°Г*áîòû ïðîñòî Г§Г*êðûâГ*ГҐГ¬ îêГ*Г® ГЄГ®Г*ñîëè
        {
                printf("Enter x : ");scanf("%lf",&x);
                printf("Y(x) = %lf\n",Y(x));
                printf("S(x) = %lf\n",S(x));
                e = fabs(100.0*(Y(x) - S(x))/Y(x));
                printf("Error of calculations : %.2f %\n",e);
        }
        return 0;
}

Объяснение кода листинга программы

  1. В функции Y(x) вычисляется синус x.
  2. В функции S(x) вычисляется приближенное значение синуса x с помощью ряда Тейлора.
  3. В функции main() с помощью цикла while происходит запрашивание значения x и вычисление Y(x) и S(x).
  4. Значение ошибки вычислений e вычисляется как разница между 100.0*(Y(x) - S(x)) и Y(x), делённая на Y(x).
  5. Цикл while завершается при вводе значения x равного 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы