4

我不知道为什么我一直得到结果 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;
}
4

3 回答 3

7

您的factorial函数中有整数溢出。这导致它输出零。49!可被 整除2^32,因此您的factorial函数将返回零。

然后你除以它导致它无穷大。所以解决方案是prod改为double

double prod = 1;
于 2011-10-19T15:59:15.010 回答
6

您应该考虑第 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;
}
于 2011-10-19T16:04:27.513 回答
-2

您应该将 k 的最大值从 50 减少到喜欢 30 它会起作用;

还有一个问题是你的代码在 0 附近工作吗?

于 2014-07-05T06:49:20.143 回答