C++ 如何用c编写sin级数?

C++ 如何用c编写sin级数?,c++,math,trigonometry,C++,Math,Trigonometry,我对编码和尝试为大学写一个sin级数相当陌生 公式如下所示: #include "stdafx.h" #include <iostream> #include <math.h> using namespace std; int fakultaet(double a) { if (a == 0) return 1; else return (a * fakultaet(a - 1)); } int main() { double si

我对编码和尝试为大学写一个sin级数相当陌生

公式如下所示:

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

int fakultaet(double a)
{
  if (a == 0)
    return 1;
  else
    return (a * fakultaet(a - 1));
}

int main()
{

    double sin = 0, y, f; // sin = Sinus, y= angle, n=index
    printf("please insert the angle \n");
    scanf("%lf", &y);

    double x = y * 3.14159265359 * 1 / 180; // x = radian measure

    for (int n = 0; n < 5; ++n)
    {
        sin += pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(2 * n + 1);
    }

    printf("The sinus is %lf\n", sin);

    system("Pause");

    return 0;
}

所以我试着编码它。。。不知怎的,它计算的是弧度,而不是鼻窦。。。怎么了

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

double n, a;

int fakultaet(double a = 2 * n + 1)
{
  if (a == 0)
    return 1;
  else
    return (a * fakultaet(a - 1));
}

int _tmain(int argc, _TCHAR* argv[])
{
    double sin, y, f; // sin = Sinus, y= angle, n=index
    printf("please insert the angle \n");
    scanf("%lf", &y);

    double x = y * 3.14159265359 * 1 / 180; // x = radian measure

    while (n < 5)
    {
        sin = pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(a);
    }

    printf("The sinus is %lf\n", sin);

    system("Pause");

    return 0;
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
双n,a;
内部法库尔泰特(双a=2*n+1)
{
如果(a==0)
返回1;
其他的
报税表(a*fakultaet(a-1));
}
int _tmain(int argc,_TCHAR*argv[]
{
双正弦,y,f;//正弦=正弦,y=角度,n=指数
printf(“请插入角度”);
扫描频率(“%lf”、&y);
双x=y*3.14159265359*1/180;//x=弧度测量
而(n<5)
{
sin=pow(-1,n)*pow(x,2*n+1)/fakultaet(a);
}
printf(“窦是%lf\n”,sin);
系统(“暂停”);
返回0;
}

您没有增加sin或n。此外,硬编码阶乘的输入值也不好。 它应该更像这样:

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

int fakultaet(double a)
{
  if (a == 0)
    return 1;
  else
    return (a * fakultaet(a - 1));
}

int main()
{

    double sin = 0, y, f; // sin = Sinus, y= angle, n=index
    printf("please insert the angle \n");
    scanf("%lf", &y);

    double x = y * 3.14159265359 * 1 / 180; // x = radian measure

    for (int n = 0; n < 5; ++n)
    {
        sin += pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(2 * n + 1);
    }

    printf("The sinus is %lf\n", sin);

    system("Pause");

    return 0;
}
转换为非硬编码版本:

int fakultaet(double a)
添加了sin初始化:

double sin = 0
更改了您的while循环:

while (n < 5)
归纳为:

sin += pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(2 * n + 1);

通过观察,您可以得到更整洁、更有效的结果 总和中的相邻项是相关的。我们可以将其表示为重复:

  • T_n=-T_{n-1}x^2/((2n+1)(2n))
  • T_0=x
这样做更好,因为它避免了调用
pow
和进行任何显式阶乘计算的需要(
fakultaet

代码如下所示:

int main() {
  ...
  double T = x;
  double sin = T;
  for(int i=1 ; i<5; ++i) {
    T *= -(x*x) / ((2*i+1)*(2*i));
    sin += T;
  }
  ...
}
intmain(){
...
双T=x;
双sin=T;

for(int i=1;i因为n永远不会达到5?那么我该如何更改它?我的意思是,我们从何处得知进程何时结束,所以我决定以某种方式完成它…我应该设置n=5吗?在循环中,你需要递增
n
。也许你想要一个for循环。为什么
n
是一个双精度循环?为什么在
main()之外声明它 >代码> > tMeN/COD>不是托管环境中C程序的兼容条目。这是C++,而不是C(只是坏编码风格-为什么不使用IOSROW方法?)@ DRESCHJM确实,谢谢您注意到为什么设置了Sin 0?为什么设置了Sin 0?如果没有设置它,则代码< < S> < /代码>将不初始化。(可能包含内存中的随机垃圾值,这将使您的计算成为垃圾..)。
sin += pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(2 * n + 1);
int main() {
  ...
  double T = x;
  double sin = T;
  for(int i=1 ; i<5; ++i) {
    T *= -(x*x) / ((2*i+1)*(2*i));
    sin += T;
  }
  ...
}