sin — В C ++ поиск значения sinx с помощью ряда Тейлора

Я пытаюсь написать блок кодов на C ++, который вычисляет значение sinX с помощью ряда Тейлора.

#include <iostream>
using namespace std;
// exp example
#include <cstdio>      // printf
#include <cmath>       //  exp

double toRadians(double angdeg)         //convert to radians to degree
{                                       //x is in radians
const double PI = 3.14159265358979323846;
return angdeg / 180.0 * PI;
}

double fact(double x)       //factorial function
{                           //Simply calculates factorial for denominator
if(x==0 || x==1)
return 1;
else
x * fact(x - 1);
}

double mySin(double x)      //mySin function
{
double sum = 0.0;
for(int i = 0; i < 9; i++)
{
double top = pow(-1, i) * pow(x, 2 * i + 1);  //calculation for nominator
double bottom = fact(2 * i + 1);              //calculation for denominator
sum = sum + top / bottom;                     //1 - x^2/2! + x^4/4! - x^6/6!
}
return sum;
}

int main()
{
double param = 45, result;

result = mySin(toRadians(param)); //This is my sin value
cout << "Here is my homemade sin : " << result << endl;

result = sin(param);              //This is library value
cout << "Here is the API sin : " << result << endl;

return 0;
}

Так что моя программа работает без ошибок. Мой вывод точно:

Вот мой самодельный грех: nan
Вот грех API: 0.850904

Я знаю, что делаю большую логическую ошибку, но я не смог ее найти. Это моя вторая неделя с C ++. Я больше знаком с Java. Я кодировал то же самое, и он работал абсолютно идеально. Ответы соответствовали друг другу.
Спасибо за ваше время и внимание!

1

Решение

  1. в factВы пропустите возвращение: x*fact(x-1); должно быть return x*fact(x-1);, Вы можете увидеть жалобу компилятора, если вы включите предупреждения. Например, с GCC, позвонив g++ -Wall program.cpp дает Warning: control reaches end of non-void function для факториальной функции.

  2. API sin также нужен угол в радианах, поэтому изменить result=sin(param); в result=sin(toRadians(param));, Как правило, если у вас есть сомнения по поводу API, обратитесь к документации, например, Вот.

3

Другие решения

Кажется, в ваших кодах есть некоторые логические ошибки. Вот мой исправленный:

#include <iostream>

using namespace std;

double radians(double degrees)  // converts degrees to radians
{
double radians;
double const pi = 3.14159265358979323846;
radians = (pi/180)*degrees;
return radians;
}

double factorial(int x)  //calculates the factorial
{
double fact = 1;
for(; x >= 1 ; x--)
{
fact = x * fact;
}
return fact;
}

double power(double x,double n)  //calculates the power of x
{
double output = 1;
while(n>0)
{
output =( x*output);
n--;
}
return output;
}

float sin(double radians)  //value of sine by Taylors series
{
double a,b,c;
float result = 0;
for(int y=0 ; y!=9 ; y++)
{
a=  power(-1,y);
b=  power(radians,(2*y)+1);
c=  factorial((2*y)+1);
result = result+ (a*b)/c;
}
return result;
}

double n,output;

int main()
{
cout<<"enter the value\t";
cin>>n;

n = radians(n);
cout<< "\nthe value in radians is\t"<< n << "\n";

output = sin(n);

cout<< "\nsine of the given value is\t"<< output;
return 0;
}

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

В этой программе есть четыре пользовательские функции. Первые три пользовательские функции ‘radians ()’, ‘factorial ()’, ‘power ()’, по-видимому, являются простыми функциями, которые выполняют операции, как следует из их названия.

Четвертая функция ‘sin ()’ принимает входные данные в радианах, заданные функцией ‘radians ()’. Функция sin использует итеративный термин ряда Тейлорса в цикле функции for (int y = 0; y! = 9; y ++) до девяти итераций для вычисления выходных данных. Цикл for () повторяет общее математическое выражение: срок (п) = ((- 1) ^ п) (х ^ (2n + 1)) / (2n + 1).!

0

По вопросам рекламы [email protected]