PascalABC.NET
January 10, 2023

Как вычисляется Exp(a)

Элементарные функции в стандартной библиотеке вычисляются как правило с помощью разложения в ряд Тейлора. На скриншоте приведен ряд Тейлора для вычисления Exp(a).

Берется n членов ряда. Число n выбирается так чтобы следующий член ряда был сравним с машинной точностью.

Ниже приводится полная программа для вычисления Exp(2):

begin
  var a := 2.0; // exp(2.0)
  var n := 22;
  var x := 1.0;
  var s := x;
  for var i := 1 to n do
  begin
    x := x * a / i;
    s += x;
    Println(#39;{i,2} {s,17:f14}  {abs(s - exp(a)),0:E1}');
  end;
end.

Результат:

 1  3.00000000000000  4.4E+000 
 2  5.00000000000000  2.4E+000 
 3  6.33333333333333  1.1E+000 
 4  7.00000000000000  3.9E-001 
 5  7.26666666666667  1.2E-001 
 6  7.35555555555556  3.4E-002 
 7  7.38095238095238  8.1E-003 
 8  7.38730158730159  1.8E-003 
 9  7.38871252204585  3.4E-004 
10  7.38899470899471  6.1E-005 
11  7.38904601571268  1.0E-005 
12  7.38905456683234  1.5E-006 
13  7.38905588238921  2.2E-007 
14  7.38905607032591  2.9E-008 
15  7.38905609538414  3.5E-009 
16  7.38905609851641  4.1E-010 
17  7.38905609888492  4.6E-011 
18  7.38905609892586  4.8E-012 
19  7.38905609893017  4.8E-013 
20  7.38905609893060  4.6E-014 
21  7.38905609893065  5.3E-015 
22  7.38905609893065  1.8E-015 

Таким образом, для достижения машинной точности 1e-15 требуется n=22 члена ряда или в операциях: 22 сложения, 22 умножения и 22 деления, 44 присваивания.

Заключение

Вычисление стандартных функций - весьма дорогостоящее. Но ускорить эти алгоритмы нельзя.