我刚开始学习 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) 任何其他评论/提示/技巧,以便将来学习更多?
最佳答案
使用
a < 2*n +1
.15 的阶乘是
1,307,674,368,000
.该数字不能由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))
当你使用这个逻辑时,你不需要pow
或 factorial
.您可以很容易地从第 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/