使用c++的Exp函数

exp function using c++

本文关键字:函数 Exp c++ 使用      更新时间:2023-10-16

我不明白为什么我总是得到结果1。#INF从my_exp()当我给它1作为输入。下面是代码:

double factorial(const int k)
{
    int prod = 1;
    for(int i=1; i<=k; i++)
        prod = i * prod;
    return prod;
}
double power(const double base, const int exponent)
{
    double result = 1;
    for(int i=1; i<=exponent; i++)
        result = result * base;
    return result;
}
double my_exp(double x)
{
    double sum = 1 + x;
    for(int k=2; k<50; k++)
        sum = sum + power(x,k) / factorial(k);
    return sum;
}

您的factorial函数中有一个整数溢出。这导致它输出零。49!能被2^32整除,所以你的factorial函数将返回零。

然后除以它,使它趋于无穷。因此,解决方案是将prod更改为double:

double prod = 1;

与其完全计算展开中每一项的幂和阶乘项,不如考虑第k项与第k-1项之间的关系,并根据这种关系更新每一项。这将避免幂函数和阶乘函数中令人讨厌的溢出(您将不再需要它们)。例如

double my_exp(double x)
{
    double sum = 1.0 + x;
    double term = x;                 // term for k = 1 is just x
    for (int k = 2; k < 50; k++)
    {
        term = term * x / (double)k; // term[k] = term[k-1] * x / k
        sum = sum + term;
    }
    return sum;
}

你应该把k的最大值从50降到30这样就可以了;

和一个问题你的代码工作在接近0 ?