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

Код для расчета тригонометрических функиций - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Iblis
Сообщений: n/a
03.10.2011, 23:11     Код для расчета тригонометрических функиций #1
Здравствуйте. Нужна помощь в написании кода для расчета тригонометрических функций (sin,cos) без использования библиотеки math.h. То есть сделать это все через ряд Тейлора. И если можно добавить функцию построения графика.

Ряд Тейлора для sin:
http://www.pm298.ru/Math/f1877.JPG


для cos:
http://www.pm298.ru/Math/f1878.JPG
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.10.2011, 23:16     Код для расчета тригонометрических функиций #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double Sin(double x, double eps)
{
   int i;
   double p, rez;
   i = 1;
   rez = p = x;
   while(fabs(p) >= eps)
   {
       i += 2;
       p *= -(x*x)/((i-1)*i);
       rez += p;
   }
   return rez;
}
Добавлено через 38 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double Cos(double x, double eps)
{
   int i;
   double p, rez; 
   i = 0;
   rez = p = 1;
   while(fabs(p) >= eps)
   {
       i += 2;
       p *= -(x*x)/((i-1)*i);
       rez += p;
   }
   return rez;
}
Вызов: Sin(2, 10e-100), Cos(5, 10e-100).
Второй параметр - точность вычисления, то есть ошибка не будет превышать значения eps.

В алгоритме использовано свойство рядов Лейбница.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.10.2011, 23:55     Код для расчета тригонометрических функиций #3
Вызов: Sin(2 , 10e- 100), Cos(5, 10e- 100).
десять умноженое на десять в минус сотой степени? Ничё так точность...
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 16:19     Код для расчета тригонометрических функиций #4
Цитата Сообщение от easybudda Посмотреть сообщение
десять умноженное на десять в минус сотой степени?
Вы правы, что-то я нолик не туда добавил. Конечно, 1e-100
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.10.2011, 16:20     Код для расчета тригонометрических функиций #5
Цитата Сообщение от Thinker Посмотреть сообщение
Конечно, 1e-100
не-а!
1e-3


Так бы было один на десять в минус сотой степени - тоже очень маленькое число...
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 16:21     Код для расчета тригонометрических функиций #6
Цитата Сообщение от easybudda Посмотреть сообщение
не-а!
1e-3
Почему так мало?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.10.2011, 16:26     Код для расчета тригонометрических функиций #7
Цитата Сообщение от Thinker Посмотреть сообщение
Почему так мало?
Одна тысячная? Да в принципе нормальная точность... Нанотехнологии в районе 1е-9 крутятся...
Код
C:\c_cpp\numbers>gcc -o 1e 1e.c

C:\c_cpp\numbers>1e
0.0010000000
0.0000000010

C:\c_cpp\numbers>type 1e.c
#include <stdio.h>

int main(void){
        printf("%.10f\n%.10f\n", 1e-3, 1e-9);
        return 0;
}

C:\c_cpp\numbers>
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
06.10.2011, 16:30     Код для расчета тригонометрических функиций #8
Thinker, почему-то я уверен что вы компетентны в вопросе. если не трудно, загляните пожалуйста сюда
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 16:31     Код для расчета тригонометрических функиций #9
Цитата Сообщение от easybudda Посмотреть сообщение
Одна тысячная?
Кажется, что маловато будет Ну, с другой то стороны, главное функции, а уж точность каждый под себя может подобрать. А Вы случайно не знаете какая у встроенных функций точность?
Nameless One
06.10.2011, 16:32
  #10

Не по теме:

Гляжу я на точность 10e-100, на эту табличку, и что-то меня напрягает... Казалось бы, при чем здесь гугол?

Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 16:44     Код для расчета тригонометрических функиций #11
Цитата Сообщение от Nameless One Посмотреть сообщение

Не по теме:

Гляжу я на точность 10e-100, на эту табличку, и что-то меня напрягает...

Точно...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.10.2011, 16:49     Код для расчета тригонометрических функиций #12
Цитата Сообщение от Thinker Посмотреть сообщение
А Вы случайно не знаете какая у встроенных функций точность?
Нет, к сожалению, знаю только, что диапазон типа double от 1E-37 до 1E+37, с точностью не менее 10 значащих десятичных цифр... Но стало интересно, надо подумать, как выяснить...
Опоздал немного...
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
06.10.2011, 16:54     Код для расчета тригонометрических функиций #13
Thinker, у меня где-то так же, но это зависит от реализации. Я к тому, что зачем такая точность, и в какой области она будет иметь значение, если 10e100 - это число, которое на много порядков превосходит число атомов в известной части вселенной?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 17:01     Код для расчета тригонометрических функиций #14
спасибо за полезные замечания, но почему тогда так работает

C++
1
printf("%f", Sin(2, 1e-100));
если диапазон от 1e-37 до 1e37?
Это же для типа float такой диапазон, а для double от 1e-307 до 1e307, разве нет? А для типа long double от 1.7e-4932 до 1.7e4932
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
06.10.2011, 17:07     Код для расчета тригонометрических функиций #15
Thinker, смотрим комментарий:
The following panel shows the name of the different values defined in this header and their minimal magnitudes (positive numbers may be greater in value, and negative number may be less in value). Any particular implementation may have characteristics with greater magnitudes than those shown here
Т.е. это минимальные требования к реализации. Конкретная реализация может предоставлять более широкий диапазон
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 17:10     Код для расчета тригонометрических функиций #16
Цитата Сообщение от Nameless One Посмотреть сообщение
это минимальные требования к реализации. Конкретная реализация может предоставлять более широкий диапазон
Все, теперь на свои места вновь стало все, спасибо, все как и думал раньше С учетом всего сказанного можно рассмотреть точность 1e-10, в любом случае пройдет
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.10.2011, 17:16     Код для расчета тригонометрических функиций #17
Цитата Сообщение от Thinker Посмотреть сообщение
но почему тогда так работает?
Так тоже работает
C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include <limits.h>
    
int main(void){
    int i = INT_MAX * 10 - (INT_MAX * 10 - 1);
    printf("%d\n", i);
    return 0;
}
и даже печатает единицу, хоть и ругается при компиляции...

Мало того, опытным путём установлено:
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
#include <stdio.h>
#include <math.h>
    
double Sin(double x, double eps)
{
   int i;
   double p, rez;
   i = 1;
   rez = p = x;
   while(fabs(p) >= eps)
   {
       i += 2;
       p *= -(x*x)/((i-1)*i);
       rez += p;
   }
   return rez;
}
 
int main(void){
    printf("%.20f\n", Sin(2, 1e-100));
    printf("%.20f\n", Sin(2, 1e-90));
    printf("%.20f\n", Sin(2, 1e-14));
    printf("%.20f\n", Sin(2, 1e-13));
    return 0;
}
Код
C:\c_cpp\numbers>custom_sin.exe
0.90929742682568171000
0.90929742682568171000
0.90929742682568171000
0.90929742682568204000
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 17:23     Код для расчета тригонометрических функиций #18
Цитата Сообщение от easybudda Посмотреть сообщение
Так тоже работает
Имелось ввиду, что не просто работает, а не зацикливается, как при нуле, например. Видите, Ваш опыт показал насколько важна точность Тут просто аргумент такой, а если с периодами числа, то всякое может быть. Хотя, согласен, -100 это слишком. На этом я и не настаивал, просто пример был, можно и 1e-3, как Вы предложили, меня сам алгоритм более интересовал.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.10.2011, 17:37     Код для расчета тригонометрических функиций #19
Цитата Сообщение от Thinker Посмотреть сообщение
меня сам алгоритм более интересовал.
Ну на этот счёт сомнений-то как-раз небыло. Кстати
C
1
printf("%.20f", sin(2.0));
всё то же 0.90929742682568171000 выдаёт...

Вот ещё смелый эксперимент:
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <math.h>
    
int main(void){
    int i;
    for ( i = 100; ( 1.0 / pow(10.0, (double)i) ) > 0.0; ++i )
        ;
    printf("%d\n", i);
    return 0;
}
выдало 309...

Не по теме:

А вообще, наверное, про точность лучше бы отдельную тему создать, а то отвлеклись мы сильно...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2011, 17:46     Код для расчета тригонометрических функиций
Еще ссылки по теме:

Программа для расчета логарифма C++
C++ Программа для расчета энергии
Функция для расчета доли C++

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 17:46     Код для расчета тригонометрических функиций #20
easybudda, а вот так уже не совпадает

C++
1
2
   printf("%.20f\n", Sin(3, 1e-100));
   printf("%.20f\n", sin(3));
Yandex
Объявления
06.10.2011, 17:46     Код для расчета тригонометрических функиций
Ответ Создать тему
Опции темы

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