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

Error when Calculating the Approximate Value of e^x

本文关键字:近似值 出错 计算      更新时间:2023-10-16

我对 c++ 相当陌生,并编写了一个程序来计算 e^x 的近似值。由公式给出:

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

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

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;
}

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

做这样的事情就可以了:

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

即使是双精度也只能容纳这么多数字。计算机始终有限制。我对科学计算一无所知,但我想如果你想要更高的精度,你可能必须找到一个四精度浮点数或其他东西。

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

Java有一个名为BigDecimal的类,它允许你创建具有任意大精度的数字。在C++中,你可能想参考这个问题:有没有一个C++等同于Java的BigDecimal?