double fi::fsin(double x, double e)
{
k=0;
fs=x;
U=x;
while (U>e)
{
k++;
U=(x*x*U)/(2*k*(2*k+1));
fs+=pow((-1),k)*U;
}
return fs;
}
void fi::fsout(double x)
{
cout<<'\t'<<"Function sin(x)"<<endl<<endl;
cout<<"Our sin("<<x<<") ="<<fs<<endl<<endl;
cout<<"C++ sin("<<x<<") ="<<sin(x)<<endl<<endl;
}
функция sin
Ну задача такая вычеслить синус путем разложения функции в ряд тейлора и сравнить с библиотечным вычелением.Все роботает норм, но до x меньше 30 а дальше уже вычесления не совпадает с библиотечным.кто знает почему?
Соответственно слагаемое U становится слишком большим для точного представления его типом double. Тип double имеет большую точность, но всё же он не резиновый.
Так, для x=31, U достигает значения 2*10^12. О какой точности может идти речь?
Рекомендуется сначала привести значение аргумента x к диапазону -2*pi<x<2*pi.
Код:
x=fmod (x, 2*M_PI)
И точность вычислений возрастёт, ряд будет сходиться гораздо, гораздо быстрее для больших значений x.
Если функции fmod() нет, попробуйте remainder(x, 2*M_PI).