我是学习c ++的新手.由于好奇心,我创建了一个正弦函数而不使用任何库(iostream除外,用于输入和输出).这是我写的代码,它完美地运行.
#includeusing 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))
使用此逻辑时,您不需要
pow
或factorial
.你很容易从第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.35078322768961955891PS当N从20变为200时,输出没有变化.