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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.66
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 12:36     Задание на вычисление синуса #1
В этой задачке нужно вычислить синус вводимого угла без использования библиотеки <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";
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ailia
27 / 26 / 1
Регистрация: 27.12.2009
Сообщений: 106
12.04.2011, 12:42     Задание на вычисление синуса #2
что именно не получается?
Alekcandr9
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
Для продолжения нажмите любую клавишу . . .
ailia
27 / 26 / 1
Регистрация: 27.12.2009
Сообщений: 106
12.04.2011, 12:52     Задание на вычисление синуса #4
может <math.h> подключить?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.04.2011, 12:55     Задание на вычисление синуса #5
Цитата Сообщение от Alekcandr9 Посмотреть сообщение
Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 1.50902e+010
Синус равен: -2.52255e+009
А что за угол 90 радиан?
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 12:55  [ТС]     Задание на вычисление синуса #6
извините я криво написал условие, но сейчас переписываю , дело в том что ни math.h ни cmath нельзя подключать
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.04.2011, 12:56     Задание на вычисление синуса #7
Должно, кстати, получиться 0.893996664.
Alekcandr9
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";//Вывод полученного значения синуса
}
кстати мне писали убрать + после синуса когда писал комменты понял что вы были правы
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 13:08     Задание на вычисление синуса #9
сорри был не прав
Alekcandr9
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
Для продолжения нажмите любую клавишу . . .
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 13:18     Задание на вычисление синуса #11
полюбому не правильно(
Alekcandr9
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
Для продолжения нажмите любую клавишу . . .
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 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;
}
Alekcandr9
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 минуту
вернее не вычисляю а суммирую
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 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 минуту
и я не вижу нахождение факториала?
Alekcandr9
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
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 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
факториал точно не так вычисляется ....
Alekcandr9
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
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 20:04     Задание на вычисление синуса #19
ну можно и так а можно просто создать переменную которая будет отвечать за знак и где нибудь в конце цикла умножать её на -1 .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2011, 20:08     Задание на вычисление синуса
Еще ссылки по теме:

C++ Циклы: вычисление синуса
C++ Разложение в ряд квадратного синуса
C++ Неправильное вычисление синуса угла

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

Или воспользуйтесь поиском по форуму:
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 20:08  [ТС]     Задание на вычисление синуса #20
да вы правы факториал не так вычисляется(
Yandex
Объявления
12.04.2011, 20:08     Задание на вычисление синуса
Ответ Создать тему
Опции темы

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