为e ^ x获取泰勒扩展的inf,但仅限于小的误差范围

时间:2018-03-25 00:10:39

标签: c++ taylor-series

我正在编写一个近似指数函数的程序,但我遇到了问题。对于err的小值,程序会混乱并且只是永远循环,每次都得到inf的近似值。当输入较大的x时,该程序似乎不能容忍越来越大的错误。它适用于x=1err=10e-5。作为一个不起作用的例子:x=3它可以正常工作err=10e-4,但当err=10e-5时会产生inf。

//This program approximates e^x at a given x to a given accuracy
#include<algorithm>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
inline void keep_window_open() {char ch; cin >> ch;}
class bad_entry{};
int fac(int a) //function to find factorial
{
    int f=1; //covers 0!
    for(int w=0; w<a; ++w)
    {
        f*=(a-w);
    }
    return f;
}
int main()
{
    try
    {
        double x=0;
        double ans=0;
        double err=0;
        int n=0; 
        cout << "What number do you want to expand around?\n";
        cin >> x;
        if(!cin){throw bad_entry{};}
        cout << "What would you like the error to be within?\n";
        cin >> err;
        if(!cin){throw bad_entry{};}
        double actual=exp(x);
        while(n>=0)
        {
            ans += pow(x,n)/fac(n);
            cout << "n=" << n << '\t' << "Approx: " << ans << '\t' << "Erro: " << abs(actual-ans) << '\n';
            if(abs(actual-ans)<err)
            {
                keep_window_open();
                return 0;
            }
            ++n;
        }
    }
    catch(bad_entry)
    {
        cout << "\nINVALID ENTRY\n";
        return 0;
    }
}

2 个答案:

答案 0 :(得分:0)

如果您编写的程序仅打印fac以增加n值,您将获得:

n=1  fac=1
n=2  fac=2
n=3  fac=6
n=4  fac=24
n=5  fac=120
n=6  fac=720
n=7  fac=5040
n=8  fac=40320
n=9  fac=362880
n=10 fac=3628800
n=11 fac=39916800
n=12 fac=479001600
n=13 fac=1932053504  // Ups - wrong - should be 6227020800
n=14 fac=1278945280  // Ups - wrong
n=15 fac=2004310016  // Ups - wrong

因此,n等于13时已经出现溢出。因此,所有计算都会失败并产生奇怪的结果。

如果您更改fac功能以使用uint64_t而不是int,那么它会更好一点,即在溢出之前更高n

答案 1 :(得分:0)

你的“while”循环实际上是分歧的;你正在递增计数器而不是递减。 此外,“pow”函数本身实现为“exp(y * ln(x))”,这使得您的实现冗余,低效且不精确。 因子计算使得复杂度O(n2)变差。一个简单的增加for循环而没有中断,将精度标准作为条件子句,并且增加计算阶乘和整数x幂将起作用。