Форум программистов, компьютерный форум CyberForum.ru

Расчет синуса и косинуса по ряду Тейлора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 107, средняя оценка - 4.78
$$RaMpAgE
 Аватар для $$RaMpAgE
1 / 1 / 0
Регистрация: 04.10.2010
Сообщений: 17
10.11.2010, 16:28     Расчет синуса и косинуса по ряду Тейлора #1
помогите посчитать синус и косинус с помощью ряда Тейлора
Как я понимаю синус и косинус это тип double? т.е там должно быть 13 знаков после зяпятой??
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vital792
1987 / 1259 / 57
Регистрация: 05.06.2010
Сообщений: 2,213
10.11.2010, 16:53     Расчет синуса и косинуса по ряду Тейлора #2
как объявишь такой тип и будет. А на счет точности это зависит от количества членов разложения. Можно задать фиксированное, можно вычислять до некоторой заданной точности.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
10.11.2010, 17:18     Расчет синуса и косинуса по ряду Тейлора #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <iomanip>
#include <cmath>
 
double sinx(double x);
double cosx(double x);
 
int main()
{
    double x;
 
    std::cout << "Enter x: ";
    std::cin >> x;
 
    std::cout << std::setprecision(15) << "sinx = " << sinx(x) << "\tlibSin = " << sin(x) << std::endl;
    std::cout << std::setprecision(15) << "sinx = " << cosx(x) << "\tlibSin = " << cos(x) << std::endl;
 
    std::cin.get();
    return 0;
}
 
double sinx(double x)
{
    double n = x;
    double sum = 0.0;
    int i = 1;
 
    do
    {
        sum += n;
        n *= -1.0 * x * x / ((2 * i) * (2 * i + 1));
        i++;
    }
    while (fabs(n) > 0.000000001);
 
    return sum;
}
 
double cosx(double x)
{
    double n = 1.0;
    double sum = 0.0;
    int i = 1;
 
    do
    {
        sum += n;
        n *= -1.0 * x * x / ((2 * i - 1) * (2 * i));
        i++;
    }
    while (fabs(n) > 0.000000001);
 
    return sum;
}
Прав был ув. KuKu, надо это вынести в фак...
$$RaMpAgE
 Аватар для $$RaMpAgE
1 / 1 / 0
Регистрация: 04.10.2010
Сообщений: 17
10.11.2010, 17:22  [ТС]     Расчет синуса и косинуса по ряду Тейлора #4
Огромное спасибо!
$$RaMpAgE
 Аватар для $$RaMpAgE
1 / 1 / 0
Регистрация: 04.10.2010
Сообщений: 17
10.11.2010, 19:25  [ТС]     Расчет синуса и косинуса по ряду Тейлора #5
а нельзя получить так чтобы совпадало до еще больше знаков после запятой
так просто для синуса совпадает 10 после запятой???
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
10.11.2010, 19:46     Расчет синуса и косинуса по ряду Тейлора #6
Точность такую поставьте
0.00000000001

Добавлено через 2 минуты
Но тут от числа зависит. Где-то точность выше, где-то ниже.
$$RaMpAgE
 Аватар для $$RaMpAgE
1 / 1 / 0
Регистрация: 04.10.2010
Сообщений: 17
10.11.2010, 19:52  [ТС]     Расчет синуса и косинуса по ряду Тейлора #7
понял, спасибо
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
10.11.2010, 22:07     Расчет синуса и косинуса по ряду Тейлора #8
C++
1
2
std::cout << std::setprecision(15) << "sinx = " << sinx(x) << "\tlibSin = " << sin(x) << std::endl;
    std::cout << std::setprecision(15) << "sinx= " << cosx(x) << "\tlibSin = " << cos(x) << std::endl;
может все таки
C++
1
2
std::cout << std::setprecision(15) << "sinx = " << sinx(x) << "\tlibSin = " << sin(x) << std::endl;
    std::cout << std::setprecision(15) << "cosx = " << cosx(x) << "\tlibCos = " << cos(x) << std::endl;
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
10.11.2010, 22:16     Расчет синуса и косинуса по ряду Тейлора #9
Да, так вернее, но суть-то от этого не меняется))) А Ctrl+C рулит.
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
10.11.2010, 22:46     Расчет синуса и косинуса по ряду Тейлора #10
Канещно рулэт!!!
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
17.09.2013, 05:00     Расчет синуса и косинуса по ряду Тейлора #11
silent_1991, а вы не учитывали того, что ваша функция подсчета косинуса не работает уже при значении x более 35? Вы действительно правильно используете ряд Тейлора, но там ведь у вас постоянно идёт умножение на x^2, поэтому даже при достаточно маленьких значениях x переменная double переполняется. Поэтому нужно учитывать переодичность косинуса и уже от этого плясать.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.09.2013, 17:36     Расчет синуса и косинуса по ряду Тейлора #12
kebal, ух ты ж вы темку-то откопали... Три года прошло, как никак.
Вообще нет, не учитывал. Ибо мне было (и до сих пор есть) как-то не до подобных нюансов. В качестве учебной реализации сойдёт, в качестве промышленной - сойдёт math::cos, вот и все дела.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
17.09.2013, 20:18     Расчет синуса и косинуса по ряду Тейлора #13
В качестве учебной реализации это как раз никак не пойдет. У вас по сути программа работает в 50 случаях из бесконечнсти, а это очень плохо. Вы сразу же учите человека плохому программированию. Я понимаю, если бы вы хотя бы отметили это когда писали код. А иначе это можно просто назвать тяп ляп. Нужно решение? Ловите маленький кусочек.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.09.2013, 10:46     Расчет синуса и косинуса по ряду Тейлора #14
Цитата Сообщение от kebal Посмотреть сообщение
У вас по сути программа работает в 50 случаях из бесконечнсти, а это очень плохо.
Реализация, учитывающая бесконечность случаев из бесконечности на учебную уже далеко как не тянет.
Цитата Сообщение от kebal Посмотреть сообщение
Вы сразу же учите человека плохому программированию.
Я не преподаватель, я учить не нанимался. Если приходишь на форум и просишь готовое решение - будь готов получить полуфабрикат.
Цитата Сообщение от kebal Посмотреть сообщение
Я понимаю, если бы вы хотя бы отметили это когда писали код.
Повторяюсь, я об этих нюансах не задумывался. Когда пишешь не промышленный код, да ещё и не для себя, не сильно задумываешься о полном покрытии тестами.
Цитата Сообщение от kebal Посмотреть сообщение
Нужно решение? Ловите маленький кусочек.
Предпочитаю придерживаться именно такого принципа. За себя я уже отучился, учиться второй раз за кого-то не намерен. Строго говоря, на программировании написание вычисления функции f(x) при помощи ряда Тейлора дают где-то на второй-третей лабораторной, и цель этого задания - научиться работать с циклами. Правда, тут это сошло на нет, поскольку цикл я написал за ТСа.

Повторяю, это подойдёт в качестве учебного решения. Если в эту сторону копать, то для некоторых входных значений (для некоторых икс) ширины дабла не хватит. Пишем длинные действительные числа, чтобы этот случай учесть? Если нужен безукоризненный результат во всех случаях - добро пожаловать в мир стандартной библиотеки. Что-то не нравится - пишите собственную реализацию и выкладывайте. Претензий я ваших не заказывал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2013, 01:22     Расчет синуса и косинуса по ряду Тейлора
Еще ссылки по теме:

Задача по ряду Тейлора C++
C++ Разложение косинуса в ряд тейлора
Поясните алгоритм вычисления синуса по ряду Тейлора C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
daemian
Сообщений: n/a
09.10.2013, 01:22     Расчет синуса и косинуса по ряду Тейлора #15
Чтобы функции считали хорошо при любых значениях аргументов, вставьте в них одной из первых строк:
C
1
x = fmod(x, 2 * M_PI);
Это позволяет найти соответствующий угол в пределах -2π <= x <= 2π
А иначе да - при значениях больше 35 уже начинаются "чудеса". Как-то так...
Yandex
Объявления
09.10.2013, 01:22     Расчет синуса и косинуса по ряду Тейлора
Ответ Создать тему
Опции темы

Текущее время: 03:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru