C++ 不使用任何函数计算e^x

C++ 不使用任何函数计算e^x,c++,math,exponential,C++,Math,Exponential,我们应该用这种公式计算e^x: e^x=1+(x^1/1!)+(x^2/2!) 到目前为止,我有以下代码: while (result >= 1.0E-20 ) { power = power * input; factorial = factorial * counter; result = power / factorial; eValue += result; counter++; iterations++; } 我现在的问题是,因为

我们应该用这种公式计算e^x:

e^x=1+(x^1/1!)+(x^2/2!)

到目前为止,我有以下代码:

while (result >= 1.0E-20 )
{
    power = power * input;
    factorial = factorial * counter;
    result = power / factorial;
    eValue += result;
    counter++;
    iterations++;
}
我现在的问题是,因为阶乘是long-long类型,所以我不能真正存储大于20的数字!因此,当程序到达该点时,会输出有趣的数字

正确的解决方案的X值最多为709,因此e^709应输出:8.21840746155e+307


<>程序是用C++编写的。

如果你把<代码>因子> <代码>的类型从<代码>长长< /代码>改为<代码>双 >

两个X^ n和n!使用n(分别以指数和超指数)快速变大,很快就会溢出您使用的任何数据类型。另一方面,x^n/n!下降(最终),当它变小时,你可以停下来。也就是说,使用x^(n+1)/(n+1)!=(x^n/n!)*(x/(n+1))。比如说:

term = 1.0;
for(n=1; term >= 1.0E-10; n++)
{
    eValue += term;
    term = term * x / n;
}
(代码直接输入到这个框中,但我希望它能工作。)

编辑:请注意,术语x^n/n!对于大x,先增大一段时间,然后减小。对于x=709,它先上升到~1e+306,然后再下降到0,这刚好是
double
可以处理的极限(
double
的范围是~1e308,并且
term*x
将其推过),但是
长双精度
工作正常。当然,您的最终结果ex比任何一个术语都大,因此假设您使用的数据类型足够大,可以容纳结果,那么就可以了


(对于x=709,如果您使用
term=term/n*x,您可以不用使用
double
,但它不适用于710。)

您在这里介绍的是计算多项式的应用程序。

我可以想出另一种解决方案。 设
pow(e,x)=pow(10,m)*b
其中
b
=1
<10
,然后

m = trunc( x * log10(e) )
其中,
log10(e)
是一个常数

由此,您可以得到:

z = x-m/log10(e)
这将在0到3之间,然后使用SreevartsR给出的
b=pow(e,z)

最后的答案是

b是基数(有效数字),m是尾数(数量级)

这将比SreevartsR方法更快,您可能不需要使用高精度

祝你好运

这甚至适用于x小于0且负值更大的情况,在这种情况下,z将在0到-3之间,这将比任何其他方法都快


因为z是-3到3,如果您需要前20个有效数字,那么pow(e,z)表达式最多只能计算37个项,因为3^37/37!=~3.2e-26.

试图用产生的双精度阶乘计算e^709:-1.#IND和最大迭代,我想很抱歉,它太密集了,但我无法得到它。。当我用709替换X时,答案是1.8046..e+016是的,我在答案中添加了一个注释来解决这个问题。x=709已经到了double可以处理的极限了。。谢谢如果不是太多,你能解释一下你刚才讲的数学吗?不知道一个简单的术语*x/n是怎么做到的。。我的初始解显然比它应该的要长得多,因为数学不是太多:)术语是1,x/1,xx/(1*2),xxx/(1*2*3),xxxx/(1*2*3*4),等等。也就是说,x^2/2!术语是(x/2)乘以x^1/1!术语,x^3/3!术语是(x/3)乘以x^2/2!一般来说,x^n=x^(n-1)*x和n=(n-1)*n(这是阶乘的定义),所以x^n/n!=x^(n-1)*x/((n-1)!*n)=[x^(n-1)/(n-1)!]*(x/n)。也就是说,x^n/n!术语是前一个术语的x/n倍。或者,换言之,您的代码有“power=power*input;factorial=factorial*counter;result=power/factorial;”,而我的代码只有“result=result*input/counter;”。同样的事情。为什么不把阶乘变成一个双精度的呢?当然它会更快——甚至更快的是编写
exp(x)
——但是它不满足“不使用任何函数计算e^x”的要求@史莱瓦沙尔:事实上,我想是的——尽管我看不出10进制的计算有什么好处。这个解决方案在哪里使用函数?@jpalecek:pow()是一个内置函数,就像exp()一样。我假设原始海报的目的恰恰不是使用exp()或其他类似函数(甚至,可能是为了使用给定的系列)。@ShreevatsaR:如果不实际调用
std::pow
,就不能执行
pow(10,integer)
?对我来说,这似乎是一项幼儿园的任务……@shrevatsar:是的,有点像。关键是,泰勒级数在零点附近收敛得更快(并且在零点附近的任何圆盘上都是一致的),因此计算起来更容易(将第700个“最大项”与此处所述的37个项进行比较)。
z = x-m/log10(e)