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.)