0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 5
1

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

03.10.2011, 23:11. Показов 5139. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Нужна помощь в написании кода для расчета тригонометрических функций (sin,cos) без использования библиотеки math.h. То есть сделать это все через ряд Тейлора. И если можно добавить функцию построения графика.

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


для cos:
http://www.pm298.ru/Math/f1878.JPG
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2011, 23:11
Ответы с готовыми решениями:

Требуется написать код программы для расчета внутренних значений массива, если известны граничные значения массива.
Подскажите, почему получаю не то что нужно. Требуется написать код программы для расчета внутренних...

Написать программу расчета значений тригонометрических функций для угла X
Задание: Написать программу расчета значений тригонометрических функций для угла X. ...

простой код для расчета по формуле
Всем доброго времени суток, знания VBA практически нулевые, идея заключается в том, что у меня...

Написать код для расчета по формулам
Добрый вечер, у меня следующая ситуация, надо написать код для расчета по формулам, но никак не...

20
Эксперт С++
4267 / 2241 / 203
Регистрация: 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.

В алгоритме использовано свойство рядов Лейбница.
3
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
05.10.2011, 23:55 3
Вызов: Sin(2 , 10e- 100), Cos(5, 10e- 100).
десять умноженое на десять в минус сотой степени? Ничё так точность...
1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 16:19 4
Цитата Сообщение от easybudda Посмотреть сообщение
десять умноженное на десять в минус сотой степени?
Вы правы, что-то я нолик не туда добавил. Конечно, 1e-100
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
06.10.2011, 16:20 5
Цитата Сообщение от Thinker Посмотреть сообщение
Конечно, 1e-100
не-а!
1e-3


Так бы было один на десять в минус сотой степени - тоже очень маленькое число...
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 16:21 6
Цитата Сообщение от easybudda Посмотреть сообщение
не-а!
1e-3
Почему так мало?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
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>
0
Заблокирован
06.10.2011, 16:30 8
Thinker, почему-то я уверен что вы компетентны в вопросе. если не трудно, загляните пожалуйста сюда
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 16:31 9
Цитата Сообщение от easybudda Посмотреть сообщение
Одна тысячная?
Кажется, что маловато будет Ну, с другой то стороны, главное функции, а уж точность каждый под себя может подобрать. А Вы случайно не знаете какая у встроенных функций точность?
0
Nameless One
06.10.2011, 16:32
  #10

Не по теме:

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

1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 16:44 11
Цитата Сообщение от Nameless One Посмотреть сообщение

Не по теме:

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

Точно...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
06.10.2011, 16:49 12
Цитата Сообщение от Thinker Посмотреть сообщение
А Вы случайно не знаете какая у встроенных функций точность?
Нет, к сожалению, знаю только, что диапазон типа double от 1E-37 до 1E+37, с точностью не менее 10 значащих десятичных цифр... Но стало интересно, надо подумать, как выяснить...
Опоздал немного...
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
06.10.2011, 16:54 13
Thinker, у меня где-то так же, но это зависит от реализации. Я к тому, что зачем такая точность, и в какой области она будет иметь значение, если 10e100 - это число, которое на много порядков превосходит число атомов в известной части вселенной?
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 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
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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
Т.е. это минимальные требования к реализации. Конкретная реализация может предоставлять более широкий диапазон
1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 17:10 16
Цитата Сообщение от Nameless One Посмотреть сообщение
это минимальные требования к реализации. Конкретная реализация может предоставлять более широкий диапазон
Все, теперь на свои места вновь стало все, спасибо, все как и думал раньше С учетом всего сказанного можно рассмотреть точность 1e-10, в любом случае пройдет
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
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
1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.10.2011, 17:23 18
Цитата Сообщение от easybudda Посмотреть сообщение
Так тоже работает
Имелось ввиду, что не просто работает, а не зацикливается, как при нуле, например. Видите, Ваш опыт показал насколько важна точность Тут просто аргумент такой, а если с периодами числа, то всякое может быть. Хотя, согласен, -100 это слишком. На этом я и не настаивал, просто пример был, можно и 1e-3, как Вы предложили, меня сам алгоритм более интересовал.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
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...

Не по теме:

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

0
Эксперт С++
4267 / 2241 / 203
Регистрация: 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));
0
06.10.2011, 17:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2011, 17:46
Помогаю со студенческими работами здесь

Составить программный код для расчета функции на VBA
y=(10sindx)/(1+d2x2), если х изменяется от 0,1 до 10 с шагом Dx=0,13, а d от 1,2 до 5,4 c шагом...

Моя программа расчета. Как написать код для кнопки.
Делаю программу, которая должна расчитывать формулу. помогите реализовать следующее событие. При...

Изменить код вызываемой функции для расчета ряда фибоначчи; заменить рекурсию на цикл; добавить вывод на экран
Помогите изменить код вызываемой функции для расчета ряда фибоначчи, но заменить рекурсию на цикл,...

Одна из функиций моего сайта
Здравствуйте, занимаюсь разработкой сайта и хочу задать вопрос. Можно ли сделать обращение к данной...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru