nixp.ru v3.0

30 мая 2017,
вторник,
12:22:25 MSK

DevOps с компанией «Флант»
molodzo написал 24 марта 2009 года в 10:35 (443 просмотра) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 1 комментарий на сайте.

Задача:

k изменяется от 0 до бесконечности ((4k+1)! / [(2k)!]^2) * x^2k = =1/2*[(1-4x)^(-3/2) + (1+4x)^(-3/2)]

X принадлежит интервалу (-1/4 ; 1/4)

Найти мин. k, которое будет удовлетворять условию:

fabs(правая часть — левая часть) < 10^(-15)

Проблема в том, что прога не может найти такого числа! Как быть?

#include

#include

#include

using namespace std;

long fact(long double val)

{if (val==0) return 1;

else return (val*fact(val-1));

}

int _tmain()

{ double x, a, f;

double k = 1;

long double left = 0;

long double right = 0;

long double step =pow(0.1,15);

do

{

cout << «Vvedite x: »;

cin >> x;

}

while ((x>=0.25) || (x<=-0.25));

f = fact(2*k);

a = fact(4*k + 1) / pow(f, 2) * pow(x, 2 * k);

right = 0.5 * (pow((1/(1 — 4 * x)), 1.5) + pow((1/(1 + 4 * x)), 1.5));

do

{

left = ((4*(4*k+3)*(4*k+5)) / ((2*k+1)*(2*k+2))) * a * pow(x,2);

cout << «Left = » << left << endl;

cout << «Right = » << right << endl;

cout << «Fabs = » << (right — left) << endl;

cout << «k = » << k << endl;

a = left;

k++;

}

while (fabs(right — left) > step);

cout << «RESULTAT :»;

cout << «k = » << k-1 << endl;

cout << «right = » << right << endl;

cout << «left = » << left << endl;

system(«pause»);

return 0;

}

metal

C какого у тебя k — double? Твоя функция вычисления факториала не корректна для double.

Мне кажеться или a — это и есть левая часть, а в цикле какая-то чушь считается?

molodzo

В цикле не чушь считается…

Это упрощенный алгоритм(т.к. если считать вслепую уравнение, то происходит переполнение памяти, отведенной под переменную)!!!

metal
molodzo
f = fact(2*k);

Факториал у тебя считается только для k=1.

left = ((4*(4*k+3)*(4*k+5)) / ((2*k+1)*(2*k+2))) * a * pow(x,2);

А вот что здесь происходит вообще не понятно.

Это упрощенный алгоритм(т.к. если считать вслепую уравнение, то происходит переполнение памяти, отведенной под переменную)!!!

Что ты подразумеваешь под переполнение памяти не очень понятно.

Догадываюсь, что переполнение стека, но это из-за использование рекурсии, от нее можно избавиться.

Ну раз алгоритм упрощенный, то ошибка в упрощении.

myst

Я нашёл. PEBKAC.

Heavy

gcc exception: invalid programmer detected