Я так и знал, что пока буду спать, просплю всё царствие небесное!
Ну, что сказать? Утро вечера мудренее. И обещанного можно и не ожидать три года...
Я поздравляю Bac, Георгий!
Формула, которую Вы предложили, позволяет вычислять основание натурального логарифма существенно быстрее, чем знаменитая формула Леонарда Эйлера.
Теперь по порядку.
1 Кодирование мной выполнено по методу формульного программирования, то есть c использованием встроенных в интегрированную среду программирования стандартных функций
exp() и
ln(), которые использованы для вычисления алгебраических выражений типа
.
2 B качестве интегрированной среды разработки (Integrated Development Environment) я использовал Турбо-Паскаль (компилятор Borland International, ver. 5.5).
3
Код программы по формуле ЭйлераКод: Выбрать все
program Euler;
uses crt,dos;
const e = 2.718281828459045;
error = 1e-9;
var n : longint;
a,b : extended;
begin
clrscr;
n:=0;
repeat
inc(n);
a:=exp(n*ln(1+1/n))
until(abs(a-e) < error);
writeln('e(',n,')=',e);
writeln('a(',n,')=',a)
end.
Запустив программу на исполнение,
ровно через 40 минут получаю следующие результаты:
- e(1160645914)=
2,71828182845905
- a(1160645914)=
2,71828182745905
Ha вычисление основания
e c заданной точностью
программе понадобилось 1160645914 итераций.
Значение основания
e=2.718281828459045 я взял из второго тома Фихтенгольца (там же заодно и саму формулу Эйлера).
4
Код программы по формуле ГеоргияКод: Выбрать все
program Georg;
uses crt,dos;
const e = 2.718281828459045;
error = 1e-15;
var k : longint;
a,b : extended;
begin
clrscr;
k:=0; a:=1;
repeat
inc(k);
b:=((k mod 2)*k/(k+1)+((k+1) mod 2)*(k+1)/k)*exp((2*k+1)*ln(1+2/(2*k+1)))/exp(2*k*ln(1+1/k));
a:=a*b;
until(abs(3*a-e) < error);
writeln('e(',k,')=',e);
writeln('a(',k,')=',3*a)
end.
Запустив теперь эту программу в той же интегрированной среде программирования, менее, чем через секунду получаю следующие результаты:
- e(166276)=
2,71828182845905- a(166276)=
2,718281828459055
Пара ремарокПрошу обратить внимание на то, что
5.1 точность вычисления основания
e в этом случае повышена до 15 знаков после запятой по сравению c 9 знаками по формуле Эйлера;
5.2 на вычисление потребовалось всего 166276 сомножителей (итераций) по сравнению c 1160645914 итерациями по формуле Эйлера.
Комментарии, как говорится, излишни.
6 Для объективного сравнения алгоритмов вычисления
e нужно отказаться от применения стандартных функций, встроенных в языки программирования типа
exp() и
ln().
Для этого я реализовал формулу Эйлера по следующему коду:
Код: Выбрать все
program Euler;
uses crt,dos;
const e = 2.718281828459045;
error = 1e-9;
var i,n : longint;
a,b : extended;
begin
clrscr;
n:=0;
repeat
a:=1.0; inc(n); b:=(1+1/n);
for i:=1 to n do a:=a*b;
until(abs(e-a) < error);
writeln('e(',n,')=',e);
writeln('a(',n,')=',a)
end.
Ожидание результата счёта для точности
затянулось до 77 минут, и я остановил выполнение программы. Ha шаге
n=734966 результат счёта оказался
a(734966)=2,4675443856, и я от этого алгоритма отказался.
Может кто-то придумает более эффективный алгоритм реализации формулы Эйлера.
7 Считаю, что работу, которую я выполнил, необходимо проверить другими независимыми способами и по иным (кроме формулы Эйлера) алгоритмам вычисления
e .
8 Ещё раз примите мои поздравления, уважаемый Георгий!