Погрешность при вычислении синуса - C (СИ)
Формулировка задачи:
вот исходный код программы(вычисляет синус через многочлен Тейлора):
sin90=0.9994085, отличие конечно небольшое но все таки... помогите найти погрешность?
#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); }
Решение задачи: «Погрешность при вычислении синуса»
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; }
Объяснение кода листинга программы
- В функции Y(x) вычисляется синус x.
- В функции S(x) вычисляется приближенное значение синуса x с помощью ряда Тейлора.
- В функции main() с помощью цикла while происходит запрашивание значения x и вычисление Y(x) и S(x).
- Значение ошибки вычислений e вычисляется как разница между 100.0*(Y(x) - S(x)) и Y(x), делённая на Y(x).
- Цикл while завершается при вводе значения x равного 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д