Я пытаюсь написать блок кодов на 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. Я кодировал то же самое, и он работал абсолютно идеально. Ответы соответствовали друг другу.
Спасибо за ваше время и внимание!
в fact
Вы пропустите возвращение: x*fact(x-1);
должно быть return x*fact(x-1);
, Вы можете увидеть жалобу компилятора, если вы включите предупреждения. Например, с GCC, позвонив g++ -Wall program.cpp
дает Warning: control reaches end of non-void function
для факториальной функции.
API sin
также нужен угол в радианах, поэтому изменить result=sin(param);
в result=sin(toRadians(param));
, Как правило, если у вас есть сомнения по поводу API, обратитесь к документации, например, Вот.
Кажется, в ваших кодах есть некоторые логические ошибки. Вот мой исправленный:
#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).!