Погрешность при вычислении синуса - 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.