Получение inf в разложении Тейлора для e ^ x, но только для небольших границ ошибок

Я пишу программу для приближения экспоненциальной функции, но я столкнулся с проблемой. Для небольших значений err программа запутывается и просто зацикливается навсегда, каждый раз получая приближения inf. Программа кажется нетерпимой к большим и большим ошибкам, поскольку больше xвведены. Это хорошо работает, скажем, x=1 а также err=10e-5, Как пример того, когда это не работает: x=3 работает нормально до err=10e-4 но когда err=10e-5 это приводит к инф.

//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;
}
}

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 до переполнения.

0

Другие решения

Ваш цикл «while» на самом деле расходится; Вы увеличиваете счетчик вместо уменьшения.
Более того, функция «pow» сама реализована как «exp (y * ln (x))», что делает вашу реализацию избыточной, неэффективной и неточной.
Факторная расстановка делает сложность O (n2) плохой. Простое увеличение для цикла без разрыва, имеющее критерии точности в качестве условия условия, и пошаговое вычисление факторных и целочисленных степеней х сделали бы эту работу.

0

По вопросам рекламы [email protected]