当前位置:  开发笔记 > 编程语言 > 正文

没有任何库的正弦函数

如何解决《没有任何库的正弦函数》经验,为你挑选了1个好方法。

我是学习c ++的新手.由于好奇心,我创建了一个正弦函数而不使用任何库(iostream除外,用于输入和输出).这是我写的代码,它完美地运行.

    #include
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'作为术语数量包含在泰勒系列中以提高准确性.我对此有一些疑问

1)我创建的sin函数,我通过反复试验发现,在for循环中,我必须写'a

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

3)我知道我写的代码很难看,我不想使用任何库函数.无论如何,我可以做些什么来使这个代码在算法方面做得更好.没有使用任何库,有没有其他有效的方法.

4)将来学习更多的其他评论/提示/技巧?



1> R Sahu..:

    使用a < 2*n +1.

    因子15是1,307,674,368,000.这个数字不能用a来表示int.您必须重新考虑用于计算泰勒级数的条件的代码sine.

    最好在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 
#include 

using namespace std;

double sin(double x, int n)
{
   double t = x;
   double sine = t;
   for ( int a=1; a> 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

PS当N从20变为200时,输出没有变化.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有