我试图编写一个取值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/

    10-11 22:07
    查看更多