Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/141: Рейтинг темы: голосов - 141, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
1

Задание на вычисление синуса

12.04.2011, 12:36. Показов 25586. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В этой задачке нужно вычислить синус вводимого угла без использования библиотеки <cmath>

Я сколько не пытался не получается вот последняя разработка "чего-то":

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
double a, b, c, sin;
int n, x;
 
int main(void)
{
setlocale(0,"Rus");
cout << "Введите значение, которого нужно вычислить синус: "; cin >> x;
for(n = 0; n < 1001; n ++){
    b += 2*n+1;
        if(n%2!=0){a = 0;}
        else if(n%2 == 0){
        a += (-1 * n); 
        c += x * b;}
        sin += a / b * c;   
}
    cout << a << "\t" << b << "\t" << c << "\n";
    cout  << "Синус равен: " << sin << "\n";
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2011, 12:36
Ответы с готовыми решениями:

Циклы: вычисление синуса
Приступил к циклам. Задание такое: Как известно, функция sin(x) может может быть вычислена в виде...

Неправильное вычисление синуса
double x, y, z; cout &lt;&lt; &quot;введите угол: &quot;; cin &gt;&gt; x; cout &lt;&lt; &quot;синус &quot; &lt;&lt; x &lt;&lt; &quot; = &quot; &lt;&lt;...

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

Неправильное вычисление синуса угла
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;math.h&gt; using namespace std; void main() {...

21
32 / 34 / 3
Регистрация: 27.12.2009
Сообщений: 106
12.04.2011, 12:42 2
что именно не получается?
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 12:49  [ТС] 3
нет не из за этого тут же происходит вычисление по формуле Тейлора

где a = -1^n, b = (2*n+1)! а c=x^(2*n+1)

результаты работы если sin += a / b * c;

Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 1.50902e+010
Синус равен: -1.506e+007
Для продолжения нажмите любую клавишу . . .

если же sin = a / b * c;

Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 1.50902e+010
Синус равен: -2.52255e+009
Для продолжения нажмите любую клавишу . . .
0
32 / 34 / 3
Регистрация: 27.12.2009
Сообщений: 106
12.04.2011, 12:52 4
может <math.h> подключить?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
12.04.2011, 12:55 5
Цитата Сообщение от Alekcandr9 Посмотреть сообщение
Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 1.50902e+010
Синус равен: -2.52255e+009
А что за угол 90 радиан?
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 12:55  [ТС] 6
извините я криво написал условие, но сейчас переписываю , дело в том что ни math.h ни cmath нельзя подключать
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
12.04.2011, 12:56 7
Должно, кстати, получиться 0.893996664.
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 13:05  [ТС] 8
taras atavin

вы знаете я и сам не пойму почему такой ответ выдаётся(

Добавлено через 8 минут
Наконец то переписал код по человечески и вот условие: Вычислить синус не используя библиотек cmath и math.h. Вычислял с помощью ряда Тейлора. Вот что получилось

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"// библеотека для ВС
#include "iostream"//библиотека для cin and cout
 
using namespace std;//определяем пространство имён
 
double a, b, c, sin;//задаём переменные типа double
int n, x;//задаём переменные типа int
 
int main(void)
{
setlocale(0,"Rus");//ставим русский шрифт
cout << "Введите значение, которого нужно вычислить синус: "; cin >> x;//Запрашиваем ввести значение и помещаем его в переменную х
for(n = 0; n < 1001; n ++){//цикл в котором перебираются значения от 0 до 1001 с шагом в 1
    b += 2*n+1;// вычисляется выражение 2n+1  а так как += то при следующем шаге происходит прибавление к этому значнию предыдущего
        if(n%2!=0){a = 0;}//если при делении n по полам остаётся остаток то а = 0 так как в ряде все степени нечётные
        else if(n%2 == 0){//если нет 
        a += (-1 * n); //вычисляется -1^n
        c += x * b;}
        sin = a / b * c;//  вычисляется синус 
}
    cout << a << "\t" << b << "\t" << c << "\n";//Вывод коэффициетнов а, б, с
    cout  << "Синус равен: " << sin << "\n";//Вывод полученного значения синуса
}
кстати мне писали убрать + после синуса когда писал комменты понял что вы были правы
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 13:08 9
сорри был не прав
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 13:13  [ТС] 10
Danvern сейчас попробую

Добавлено через 4 минуты
перевёл в радианы код:

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
#include "stdafx.h"// библеотека для ВС
#include "iostream"//библиотека для cin and cout
#define PI 3,14159265358979323846
using namespace std;//определяем пространство имён
 
double a, b, c, sin;//задаём переменные типа double
int n, x;//задаём переменные типа int
 
int main(void)
{
setlocale(0,"Rus");//ставим русский шрифт
cout << "Введите значение, которого нужно вычислить синус: "; cin >> x;//Запрашиваем ввести значение и помещаем его в переменную х
x = x * PI/180;
for(n = 0; n < 1001; n ++){//цикл в котором перебираются значения от 0 до 1001 с шагом в 1
    b += 2*n+1;// вычисляется выражение 2n+1  а так как += то при следующем шаге происходит прибавление к этому значнию предыдущего
        if(n%2!=0){a = 0;}//если при делении n по полам остаётся остаток то а = 0 так как в ряде все степени нечётные
        else if(n%2 == 0){//если нет 
        a += (-1 * n); //вычисляется -1^n
        c += x * b;}
        sin = a / b * c;//  вычисляется синус 
}
    cout << a << "\t" << b << "\t" << c << "\n";//Вывод коэффициетнов а, б, с
    cout  << "Синус равен: " << sin << "\n";//Вывод полученного значения синуса
}
результат:

Добавлено через 24 секунды
Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 4.52705e+010
Синус равен: -4.51801e+007
Для продолжения нажмите любую клавишу . . .
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 13:18 11
полюбому не правильно(
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 13:32  [ТС] 12
Это я и сам понял, знать бы в чём проблема?

Добавлено через 11 минут
Вот ищё код который мы сегодня с однокурсником писали, вернее он создавал а я смотрел

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include "iostream"
#define PI 3.14
using namespace std;
    
int main(void)
{
    double sinus,one=-1,F,rad,x;
    double factorial=1,fx;
    int i,k,n=100;
    setlocale(0,"Rus");
    cout << "\nВведите число от которого нужно вычислить синус: "; cin >> x;
    x = x * PI/190;
    for(i=1;i<=n;i++){
          if(i%2!=0){one*=(-1);
          for (k=1;k<=i;k++){factorial*=i;}//расчитать factorial
          for (k=1;k<i;k++){fx=x*x;}//рассчитать fx
          F=one*fx/factorial;
          sinus+=F;}
          else if(i%2==0){factorial*=i;fx=x*x;}
                     }
    cout<<"Res "<<sinus<<endl;
}
результаты при переводе в радианы


Введите число от которого нужно вычислить синус: 1
Res -5.05736e-006
Для продолжения нажмите любую клавишу . . .

без перевода

Введите число от которого нужно вычислить синус: 1
Res -0.018517
Для продолжения нажмите любую клавишу . . .

Добавлено через 1 минуту
извиняюсь:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include "iostream"
#define PI 3.14
using namespace std;
 
int main(void)
{
double sinus,one=-1,F,rad,x;
double factorial=1,fx;
int i,k,n=100;
setlocale(0,"Rus");
cout << "\nВведите число от которого нужно вычислить синус: "; cin >> x;
x = x * PI/190;
for(i=1;i<=n;i++){
if(i%2!=0){one*=(-1);
for (k=1;k<=i;k++){factorial*=i;}//расчитать factorial
for (k=1;k<i;k++){fx=x*x;}//рассчитать fx
F=one*fx/factorial;
sinus+=F;}
else if(i%2==0){factorial*=i;fx=x*x;}
}
cout<<"Res "<<sinus<<endl;
}
результаты при переводе в радианы


Введите число от которого нужно вычислить синус: 1
Res -5.05736e-006
Для продолжения нажмите любую клавишу . . .

без перевода

Введите число от которого нужно вычислить синус: 1
Res -0.018517
Для продолжения нажмите любую клавишу . . .
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 18:55 13
Меня заинтересовала эта тема, ну собственно я решил разобраться как вычислить синус без стандартных библиотек...
ну вот собственно код.
Вроде провел всё сходиться ))
И кстати в радианы переводить обязательно, либо писать х сразу в них.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream> 
using namespace std;
const float M_PI = 3.14159265;
 
int main()
{
  int fact = 1,z = 1,i = 1;
  double e,x,sum,xSt;
  cout << "Введите x : "; cin >> x;
  x *= M_PI / 180;
  e = 0.0001;
  xSt = x;
  for(int i = 1;xSt / fact >= e;) 
    {
      sum += (z * xSt) / fact; 
      i += 2;
      z *= -1;
      xSt *= x*x;
      fact *= (i -1) * i;
    }
  cout << sum;
  return 0;
}
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 19:30  [ТС] 14
спасибо большое что написали код для вычисления синуса теперь, т.к. я начинающий с С++ немогли бы вы пояснить как вся эта штука работает?

Добавлено через 21 минуту
и ещё вопрос, конечно очень хорошо что вы написали код, но я приследую цель не тупо скопировать откудато код, а написать свой и самое главное ПОНЯТЬ его, вернёмся непосредственно к вопросу: в течении долгих размышлений я пришёл к выводу: может у меня не получается потому что я по отдельности вычисляю a b c т.е.
C++
1
2
3
4
5
6
7
8
for(n=0; n<1000; n++){//цикл в котором перебираются значения от 0 до 1001 с шагом в 1
    if(n%2!=0){a=0;}//если при делении n по полам остаётся остаток то а = 0 так как в ряде все степени нечётные
        else{//если нет 
        a+=(-1*n);//вычисляется -1^n
        b+=2*n+1;// вычисляется выражение 2n+1  а так как += то при следующем шаге происходит прибавление к этому значнию предыдущего
        c+=x*b;}
        sin=a/b*c;//вычисляется синус 
}
??++

Потомучто в ряде Тейлора сначала происходит вычисление а затем суммирование. . .

Добавлено через 1 минуту
вернее не вычисляю а суммирую
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 19:39 15
окей.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream> 
using namespace std;
const float M_PI = 3.14159265;// число пи
 
int main()
{
  int fact = 1,z = 1; //начальные значения факториала, переменная отвечающая за знак ряда
  double e,x,sum = 0,xSt;// точность, градусы, сумма рядов, x в степени n
  cout << "Введите x : "; cin >> x;
  x *= M_PI / 180; // перевод в радианы 
  e = 0.0001;
  xSt = x;
  for(int i = 1;xSt / fact >= e;) // пока x в степени n деленное на факториал больше или равно точности
    {
      sum += (z * xSt) / fact;  // прибавляем к сумме рядов значение ряда 
      i += 2; 
      z *= -1; // меняем знак ряда 
      xSt *= x*x;  // возводим в следующую степень
      fact *= (i -1) * i; // находим факториал 
    }
  cout << sum;
  return 0;
}
в 13 посте я забыл sum инициализировать и из-за этого может получиться ложный результат...
и из этой строчки
int fact = 1,z = 1,i = 1;
надо убрать объявление i.

Добавлено через 5 минут
a+=(-1*n);//вычисляется -1^n
вот это строчка вообще неправильная по моему ..
потомуто -1^n записывается не так как увас -1 * n а например если n = 2
то это будет выглядеть так -1 * (-1) а просто -1 * умнажаете сначала 1 потом на 2,3,4,5....,1000

Добавлено через 1 минуту
и с переменной с такая же проблема

Добавлено через 1 минуту
и я не вижу нахождение факториала?
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 19:42  [ТС] 16
если n = 2 то т.к. а+=(-1*х) то получится что при х = 0 = -1 при х = 1 1 при x = 2 -1 и т.д.

Добавлено через 1 минуту
факториал вот b += 2*n+1
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 19:46 17
Цитата Сообщение от Alekcandr9 Посмотреть сообщение
если n = 2 то т.к. а+=(-1*х) то получится что при х = 0 = -1 при х = 1 1 при x = 2 -1 и т.д.
непонял...

Цитата Сообщение от Alekcandr9 Посмотреть сообщение
факториал вот b += 2*n+1
факториал точно не так вычисляется ....
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 19:57  [ТС] 18
подождите что то я уже сам перегрелся

Добавлено через 3 минуты
Сообщение от Alekcandr9 Посмотреть сообщение
если n = 2 то т.к. а+=(-1*х) то получится что при х = 0 = -1 при х = 1 1 при x = 2 -1 и т.д.
непонял...

это было неправильно будет так если n = 0 a = -1 * 0, n = 1 a = -1 * 1


Ой извиняюсь напортачил да тут я полностью неправ((

Добавлено через 5 минут
т.е. нужно чтобы при вычислении степени * ни на n а на -1 причём столько раз чему равно n
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 20:04 19
ну можно и так а можно просто создать переменную которая будет отвечать за знак и где нибудь в конце цикла умножать её на -1 .
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 20:08  [ТС] 20
да вы правы факториал не так вычисляется(
0
12.04.2011, 20:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2011, 20:08
Помогаю со студенческими работами здесь

Вычисление синуса
почему при вычислении на инженерном калькуляторе sin(1) = 0,01745.... а pascal sin(1) =...

Вычисление синуса
нужно составить прогрмамму . Вычислите значение выражения sinx+sin2x+sin3x+sin nx без...

Вычисление синуса
Добрый вечер. Не подскажете,как вычислить sin вводимого угла???? есть стандартная функция...

Вычисление гиперболического синуса
Здравствуйте, помогите решить 1 и 2 задачу с помощью процедур.


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

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