Непонятная ошибка в точности вычисления arccos - Pascal

Узнай цену своей работы

Формулировка задачи:

Написал код, но он вычисляет arccos с погрешностью:
Нашел на форуме практически такой же, но в нем все ок:
Где теряется точность в моем коде?

Решение задачи: «Непонятная ошибка в точности вычисления arccos»

textual
Листинг программы
const eps = 0.00001;
function MyArcSin(x:double):double;
var i:integer;
   curr:double;
begin
  i:= 0;
  Result:=x;
  curr:=x;
  repeat
    inc(i);
    curr := curr*x*x*(2*i-1)*(2*i)/(4*i*i);
    Result:= Result + curr/(2*i+1);
  until curr/(2*i + 1)<eps;
end;
 
var x:double;
begin
  repeat
    write('|x|<1, x = '); readln(x);
  until abs(x)<1;
  writeln(MyArcSin(x):10:6);
  writeln(arcsin(x):10:6);
  readln;
end.

Объяснение кода листинга программы

  1. В начале кода объявляется константа eps со значением 0.00001.
  2. Далее, объявляется функция MyArcSin(x:double):double, которая будет вычислять значение функции arcsin(x) с помощью метода Ньютона.
  3. Внутри функции объявляется переменная i типа integer, которая будет использоваться для контроля за циклом.
  4. Также внутри функции объявляется переменная curr типа double, которая будет использоваться для хранения текущего значения приближения.
  5. В начале цикла, значение переменной i устанавливается равным 0.
  6. Значение переменной Result устанавливается равным значению переменной x.
  7. Значение переменной curr устанавливается равным значению переменной x.
  8. Цикл повторяется до тех пор, пока значение выражения curr/(2*i + 1) меньше или равно eps.
  9. Внутри цикла, значение переменной i увеличивается на 1.
  10. Значение переменной curr вычисляется как произведение значения переменной x на значение переменной x, умноженное на (2i-1)(2i)/(4i*i).
  11. Значение переменной Result увеличивается на значение переменной curr, деленное на (2*i + 1).
  12. После окончания цикла, функция возвращает значение переменной Result.
  13. В основной части программы, значение переменной x запрашивается у пользователя с помощью функции readln(x).
  14. Далее, значения функций MyArcSin(x) и arcsin(x) выводятся на экран с помощью функции writeln(MyArcSin(x):10:6) и writeln(arcsin(x):10:6).
  15. Программа завершается после чтения значения функции arcsin(x) с помощью функции readln.
  16. Ошибка в точности вычисления arccos может возникнуть из-за использования метода Ньютона для вычисления функции arcsin(x), который может не сойтись для некоторых значений x.
  17. Для улучшения точности вычислений можно попробовать увеличить значение константы eps.
  18. Также можно попробовать изменить начальное значение переменной i или добавить проверку на некорректные значения x перед началом цикла.
  19. При использовании этого кода следует учитывать, что он может работать медленно для больших значений x.
  20. Данный код не содержит обработки ошибок и проверки на деление на ноль, поэтому при попытке деления на ноль программа может завершиться с ошибкой.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы