Все хорошо считается если n <= 133. Но дальше маткад просто ничего не считает и выводит сообщение: "Encountered a floating point error".
В справке относительно этого пишут следующее:
You are evaluating a function at a point that is not allowed. For example, the fifth argument to the relax function in Mathcad cannot have zeros in the non-boundary positions of the coefficient matrix.
Насколько я понимаю, ошибка в том, что получается слишком большое число, которое он не переваривает. Если это так, то я думаю что можно посчитать эту функцию как то по частям. Только вот идеи о том, как это сделать, в голову не приходят...
Если у кого-то есть свои соображения по этому поводу, отпишите. Буду благодарен .
Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, insanekoder, Вы писали:
I>>Имеется следующая функция:
I>>
I>>Необходимо вычислить ее значение при n = 1..500.
V>Можно, конечно, просто представить логарифмы произведений в виде суммы логарифмов, а можно пойти другой дорогой.
V>x(n+1)-x(n) V> = [2(n+1) + ld(1)+...+ld(n+1) — (n+1)*ld(n+1)] — [2n + ld(1)+...+ld(n) — n*ld(n)] V> = 2 — n*ld(n+1) + n*ld(n) V> = 2 — n * ld(1 + 1/n)
V>Начинаем с x(1)=2, а далее для каждого n=1,2,... высчитываем x(n+1) = x(n) + 2 — n * ld(1 + 1/n).
V>Кстати, разница x(n+1)-x(n) очень быстро сойдется к числу < 1, а потому посчитать так можно для ОЧЕНЬ больших n.
Вот программка:
#include <iostream>
#include <math.h>
#include <fstream>
using namespace std;
void main(void) {
double x = 2;
int n = 1;
ofstream ofil("abc.txt");
while (n <= 100000) {
ofil << "n: " << n << ", x: " << x << '\n';
x += 2 - n * log(1 + 1 / (double)n) / log(2.);
n++;
}
ofil.close();
}
Для всех n от 1 до n=100,000 просчитала где-то за секунду. При этом "n: 133, x: 78.9759" -- все правильно.