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

Cha*_*unt 9 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++;
}
Run Code Online (Sandbox Code Playgroud)

我现在的问题是,因为阶乘是长的类型,我实际上不能存储大于20的数字!所以会发生的事情是程序在到达那个点时输出有趣的数字.

正确的解决方案可以具有至多709的X值,因此e ^ 709应该输出:8.21840746155e + 307

该程序是用C++编写的.

Shr*_*saR 32

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;
}
Run Code Online (Sandbox Code Playgroud)

(代码直接在此框中输入,但我希望它可以正常工作.)

编辑:注意术语x ^ n/n!是,对于大x,增加一段时间然后减少.对于x = 709,它会在降低到0之前上升到~1e + 306,这正处于double可以处理的极限(double范围是〜1e308并将其term*x推过),但long double工作正常.当然,你的最终结果 e x比任何一个术语都大,所以假设你使用的数据类型足以容纳结果,那你就没事了.

(对于x = 709,只要你使用就double可以使用term = term / n * x,但它不适用于710.)