计算e ^ x的近似值时出错

时间:2014-08-12 19:31:12

标签: c++ math logic user-input

我对c ++很新,并编写程序来计算e ^ x的近似值。由公式给出:

1 + X + X^2/2! + ... + X^n/n!  (for values of n from 1-100)

程序完全计算该值,直到用户输入大于60的“xValue”数字(即61或更高)。我不确定为什么会这样,并且非常感谢一些反馈:

void calculate_sum(CalculateEx& numberSum)
{   
    double factoralSum;


    numberSum.xTotal = numberSum.xValue;
    numberSum.xTotal++;

    for (double counter = 2; counter <= 100; counter++)
        {
            factoralSum = 1;

            for (double factoral = 1; factoral <= counter; factoral++)
                {
                    factoralSum *= factoral;
                }

            numberSum.xNextValue = pow(numberSum.xValue, counter) / factoralSum;
            numberSum.xTotal += numberSum.xNextValue;
        }

    return;
}

3 个答案:

答案 0 :(得分:2)

不要从头开始计算下一行元素,存储前一个元素x^(n+1)/(n+1)! == (x^n)/n! * x/(n+1)。这样您就不必单独存储x^n,尤其是n!的值(它们太大而不适合任何合理的类型),而x^n/n!的值会收敛到0当n上升时。

做这样的事情会:

double prevValue = 1;
sum = prevValue;
for (size_t power = 1; power < limit; ++power) {
    prevValue *= x / (n + 1);
    sum += prevValue;
}

答案 1 :(得分:0)

即使是双倍也只能适应这么多数字。电脑总是有限制的。 我对科学计算一无所知,但我想如果你想要更高的精度,你可能需要找到一个四精度浮点数或其他东西。

答案 2 :(得分:0)

您的程序正在尝试计算超出正常双倍范围的数字。您可以通过在计算它的循环之后打印factoralSum的值来验证这一点。如果您坚持使用泰勒展开,则可能需要检查DBL_MAX<float.h>的值

Java有一个名为BigDecimal的类,它允许您创建具有任意大精度的数字。在C ++中,您可能想要引用此问题:Is there a C++ equivalent to Java's BigDecimal?