GAECHKA
Твоя помощница в решении задач

Вычислить значение выражения

Вычислить
$$r=\sqrt{{e}^{a}+{e}^{b}}$$
. Оформить вычисление
$${e}^{x}$$
как функцию
по формуле
$${e}^{x}=1+({x}^{1}/1!)+({x}^{2}/3!)+({x}^{3}/3!)+...$$
с точностью
$${10}^{-5}$$
0
вопрос задан

Источник


1 ответ
Решение
В задании опечатка. Должно быть
$$e^x=1+(x^1/1!)+(x^2/\boxed{2}!)+(x^3/3!)+...$$
.

С учетом опечатки, точно по заданию:
function e(x: real):real;
const
  eps = 1E-5;
var
  n: integer;
  a, s: real;
begin
  a := 1;
  s := a;
  n := 1;
  while abs(a) do
    begin
      inc(n);
      a := a * x / n;
      s := s + a
    end;
  e := s
end;
 
var
  a, b, r: real;
 
begin
  write('a = ');
  readln(a);
  write('b = ');
  readln(b);
  r := sqrt(e(a) + e(b));
  writeln('r = ', r);
  readln
end.
Замечание: ввиду того, что при достаточно больших x при возрастании n функция xn поначалу растёт быстрее, чем n!, в процессе вычислений может возникнуть ситуация, когда s будет настолько большим, что модуль очередного члена ряда |a| будет меньше веса младшего значащего разряда s, и сумма перестанет изменяться. Естественно, результирующая сумма будет неверна. Для того, чтобы такого не было, нужно изменить алгоритм вычисления ex, то есть, изменить задание. Один из способов: вычислять отдельно экспоненту от целой части с помощью предопределённого цикла, а экспоненту от дробной части аргумента - с помощью ряда Тейлора, после чего эти две величины перемножить. Решение будет несколько "нечестное", потому что нужно будет задать число e как константу, то есть, фактически вычислить экспоненту с помощью экспоненты. Можно ещё воспользоваться тождеством (ex/k)k=ex, и выбрать такое натуральное k, чтобы x/k было достаточно маленьким, вычислить ex/k с помощью ряда Тейлора, после чего возвести результат в k-ю степень. Можно с помощью предопределённого цикла, а лучше с помощью алгоритма быстрого возведения в степень. Но это тоже не по заданию.