我对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;
}
答案 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?