c++ - 没有任何库的正弦函数

标签 c++ c++11

我刚开始学习 C++。出于好奇,我创建了一个正弦函数而不使用任何库(iostream 除外,用于获取输入和输出)。这是我编写的代码,它运行良好。

    #include<iostream>
using namespace std;
int factorial(int n);
double sin(double x, int n);
double pow(double x, int n);
int main(){
    double num;
    int n;
    cout << "Enter any Number" << endl;
    cin >> num;
    cout << "Enter n" <<  endl;
    cin >> n;
    cout << "sine of given x equals " << sin(num, n);
}
int factorial(int n){
    int a=1;
    for(int p=1; p<=n; p++){
        a=a*p;
    }
        return a;
}
double sin(double x, int n){
    double sine=0;
    for ( int a=1, b=1; a<n+n+1; a+=2, b++){
        sine=sine + (pow(-1, b+1))*(pow(x,a))/(factorial(a));
    }
    return sine;
}
double pow(double x, int n){
    double num=1;
    for (int a=1; a<=n; a++){
        num=num*x;
    }
    return num;
}

它使用泰勒级数来计算正弦。我还将“n”作为泰勒级数中包含的项数以提高准确性。我对此有一定的疑问

1) 我创建的 sin 函数,我通过反复试验发现在 for 循环中,我必须写 'a< n+n+1' ,但是如果我尝试写 'a<2n+1'它给了我丑陋的编译错误。为什么会这样?我该怎么做才能做到这一点?

2) 如果我尝试输入较大的 n (>15-16) 值,它给出的答案为“nan”。为什么会这样?我认为 double 具有巨大的存储数字的能力 (10^408)。如我错了请纠正我。或者可以做些什么来让它计算出巨大的 n 值。

3) 我知道我写的代码很难看,我不想使用任何库函数。无论如何,我该怎么做才能使这段代码在算法方面做得更好。有没有其他不使用任何库的有效方法。

4) 任何其他评论/提示/技巧,以便将来学习更多?

最佳答案

  1. 使用 a < 2*n +1 .

  2. 15 的阶乘是 1,307,674,368,000 .该数字不能由 int 表示.您必须重新考虑用于计算 sine 的泰勒级数项的代码.

  3. 最好将您的工作代码发布到 http://codereview.stackexchange.com以获得有关如何改进代码的反馈。

泰勒级数展开式中的第 N 项是 (-1)^(N-1)x^(2*N+1)/(2*N+1)!
第 (N+1) 项是 (-1)^(N)x^(2*(N+1)+1)/(2*(N+1)+1)!

T(N+1) = -1*T(N)*x^2/((2*(N+1)+1)*(2*(N+1))

当你使用这个逻辑时,你不需要powfactorial .您可以很容易地从第 N 项导出第 (N+t) 项。起点,T(0)就是x .

这是一个示例程序:

#include <iostream>
#include <iomanip>

using namespace std;

double sin(double x, int n)
{
   double t = x;
   double sine = t;
   for ( int a=1; a<n; ++a)
   {
      double mult = -x*x/((2*a+1)*(2*a));
      t *= mult;
      sine += t;
   }
   return sine;
}

int main()
{
    double num;
    int n;
    cout << "Enter any Number" << endl;
    cin >> num;
    cout << "Enter n" <<  endl;
    cin >> n;
    cout << std::setprecision(20) << "sine of given x equals " << sin(num, n) << std::endl;

   return 0;
}

示例输入:

3.5
5

输出:

sine of given x equals -0.32838899588879211233

示例输入:

3.5
20

输出:

sine of given x equals -0.35078322768961955891

示例输入:

3.5
200

输出:

sine of given x equals -0.35078322768961955891

附言当 N 从 20 变为 200 时,输出没有变化。

关于c++ - 没有任何库的正弦函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34703147/

相关文章:

python - 从 Python 调用 C++ dll

c++ - 在 Netbeans 中编译 V8 Hello World

c++ - 以编程方式独立于其元素的值推断枚举的大小?

c++ - 像数组一样访问成员?

C++:2个数组之间的差异

c++ - 为什么函数对象应该是按值传递的

c++ - 使用另一个类的多个实例的类

c++ - 即使已安装 Azure 管道也不使用指定的编译器

c++ - 为什么无作用域枚举的声明可以编译?

c++ - 不明确的模板实例化