Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

функция sin

54K
14 ноября 2009 года
MaSTeRJeDi
2 / / 14.11.2009
Ну задача такая вычеслить синус путем разложения функции в ряд тейлора и сравнить с библиотечным вычелением.Все роботает норм, но до x меньше 30 а дальше уже вычесления не совпадает с библиотечным.кто знает почему?

Код:
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;
}
43K
14 ноября 2009 года
loki231
76 / / 27.09.2009
Просто при x>некоторого значения, функция x в степени 2n+1 (обозначим её как x^(2n+1) растёт быстрее чем (2n+1)! на некотором диапазоне значений n около 0. Для больших значений n, разумеется, lim x^(2n)/(2n)! =0, при n->+inf. Т.е. Факториал растёт быстрее.

Соответственно слагаемое 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).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог