我试图编写一个取值x并通过级数展开计算cos x的函数,但我总是得到-inf,不管读入哪个值。
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int fac(int n){
return n == 0 || n == 1 ? 1 : n * fac(n-1);
}
int main(){
double eps = 1e-15;
double x;
cin >> x;
long double ak = 1, sn = 0;
for(int k=1; abs(ak) > eps * abs(sn); k++){
double sgn = k % 2 == 0 ? 1 : -1;
sn += ak;
ak = sgn * pow(x, 2 * k) / fac(2*k);
}
cout << setprecision(4) << setw(5) << "x" << setprecision(15) << setw(20) << "cos x" << endl;
cout << setprecision(4) << setw(5)<< x << " " << setprecision(15) << setw(20) << sn << endl;
cout << setw(26) << cos(x) << endl;
return 0;
}
我调试了代码,并在某个时候
ak
得到-inf
。但为什么? 最佳答案
您在这里遇到几个问题:
fact()
溢出cin << x
。您必须谨记,我们正在为您提供帮助,并且我们都有要调试的错误。 n
跳过0,会发生什么? 解决方案:
unsigned long fac(int n)
cout << "Enter some number:
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int fac(int n){
int k = (n == 0 || n == 1 ? 1 : n * fac(n-1));
if (k > 1000) {
std::cout << "Fact k " << k << "\n";
}
return k;
}
int main(){
double eps = 1e-15;
double x;
std::cout << "Enter number: \n";
cin >> x;
fac (x);
return 1;
long double ak = 1, sn = 0;
for(int k=1; abs(ak) > eps * abs(sn); k++){
double sgn = k % 2 == 0 ? 1 : -1;
sn += ak;
ak = sgn * pow(x, 2 * k) / fac(2*k);
}
cout << setprecision(4) << setw(5) << "x" << setprecision(15) << setw(20) << "cos x" << endl;
cout << setprecision(4) << setw(5)<< x << " " << setprecision(15) << setw(20) << sn << endl;
cout << setw(26) << cos(x) << endl;
return 0;
}
如果您不明白我在问什么。我在这里也做了一些懒惰的事情,这些事情不应在生产代码中完成。
return (n <= 1 ? 1 : n * fac(n-1))
关于c++ - 计算余弦时,C++始终返回-inf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61974452/