1

我正在尝试用 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;
}

所以我的程序没有任何错误。我的输出正是:

这是我自制的 sin:nan
这是 API sin:0.850904

我知道我犯了一个很大的逻辑错误,但我找不到它。这是我使用 C++ 的第二周。我更熟悉Java。我编写了同样的代码,它工作得非常完美。答案相互匹配。感谢您的时间和关注!

4

3 回答 3

4
  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. APIsin还需要弧度的角度,所以result=sin(param);改成result=sin(toRadians(param));. 一般来说,如果对 API 有疑问,请查阅文档,例如此处

于 2014-03-14T22:25:55.663 回答
0
sin(x)= x- x^3/3! + x^5/5! -x^7/7! + x^9/9!
=x-x^3/2*3 (1- x^2/4*5 + x^4/4*5*6*7 + x^6/4*5*6*7*8*9)
=x - x^3/2*3 {1- x^2/4*5(1- x^2/6*7 + x^4/6*7*8*9)}
=x - x^3/2*3 [{1- x^2/4*5 ( 1- x^2/6*7 (1- x^2/8*9))}]
=x(1 - x^2/2*3 [{1- x^2/4*5 ( 1- x^2/6*7 (1- x^2/8*9))}])

double sin_series_recursion(double x, int n){
    static double r=1;

    if(n>1){

        r=1-((x*x*r)/(n*(n-1)));

        return sin_series_recursion(x,n-2);


    }else return r*x;
}
于 2019-12-27T22:59:14.493 回答
0

您的代码似乎有一些逻辑错误。这是我更正的一个:

#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++)”循环中使用泰勒级数迭代项,直到 9 次迭代来计算输出。“for()”循环迭代一般数学表达式:项(n)=((-1)^n).(x^(2n+1))/(2n+1)!

于 2017-12-19T10:07:26.480 回答