Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 30.09.2017
Сообщений: 4

Как в записать arccos y^2?

01.10.2017, 21:45. Показов 3561. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как в pascal записать arccos y^2
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.10.2017, 21:45
Ответы с готовыми решениями:

Как записать arccos?
помогите записать в паскале arccos((-1)^(i+j))

Как правильно записать ARCCOS в турбопаскаль
Здравствуйте! Помогите правильно записать arccos (x-b) в турбопаскаль

Как правильно записать arccos
Ребят подскажите как правильно записать в паскале arccos(1/x)!!!!!!!очень срочно нужно!

4
1 / 1 / 0
Регистрация: 01.10.2017
Сообщений: 7
02.10.2017, 09:55
Pascal
1
2
3
4
5
6
7
8
9
10
function ArcCos(X: Double): Double;
begin
  ArcCos := ArcTan(Sqrt((1+X) * (1-X)) / X);
end;
 
var Y: Double;
begin
  Y := 0.707;
  WriteLn(ArcCos(Sqr(Y))*180/Pi: 0: 10);
end.
0
Модератор
10411 / 5698 / 3401
Регистрация: 17.08.2012
Сообщений: 17,351
03.10.2017, 12:45
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

7in, Будьте внимательнее. Приведённый Вами алгоритм вычисления функции arccos(x) ошибочен. Не расстраивайтесь, это, скорее всего, потому, что именно этот ублюдочный алгоритм различные говнокодеры везде публикуют как пример для подражания, а Вы, в стремлении помочь, нашли это решение от какого-нибудь псевдо-гуру, да и опубликовали его здесь, не особенно проверив.

Что не так:

- при x=0 будет аварийное завершение программы из-за деления на 0, это, мягко говоря, нехорошо, поскольку должно получиться π/2 без никакого аварийного завершения;
- при x<1 функция возвращает неверные значения, например, при x = -1 функция вернёт 0, а должна вернуть π (конечно, в данном случае из-за y2 аргумент Вашей функции ArcCos никогда не будет отрицательным, но это нисколько не оправдывает ошибки).

Давайте немножко с этим повоюем..

Возьмём не сокращённую формулу представления arccos(x) через arctg(x):

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\arccos x=\begin{cases}\pi+\operatorname{arctg}\frac{\sqrt{1-x^2}}{x} & \text{, if } -1\leq x<0 \\\\ 0 & \text{, if } x=0 \\\\ \operatorname{arctg}\frac{\sqrt{1-x^2}}{x} & \text{, if } 0<x\leq 1  \end{cases}<br />

Получим:
Pascal
1
2
3
4
5
6
7
8
function arccos(x: real): real;
begin
  if x < 0
    then arccos := pi + arctan(sqrt(1 - x * x) / x)
    else if x > 0
      then arccos := arctan(sqrt(1 - x * x) / x)
      else arccos := 0
end;
Вроде бы всё хорошо, и для большинства применений подойдёт, но... при |x|→0 всё же может возникнуть ошибка переполнения из-за деления чего-то там очень близкого к 1 на что-то там очень близкое к 0. Чтобы этого избежать, при аргументах, близких к 0, применим формулу

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\arccos x=\frac{\pi}{2}-\arcsin x=\frac{\pi}{2}-\operatorname{arctg}\frac{x}{\sqrt{1-x^2}}<br />

Теперь разобъём интервал допустимых значений аргумента на 3 части, и дело в шляпе... Осталось выбрать границы. В принципе, оптимальным будет выбор таких границ, при котором аргумент для arctg не будет превосходить 1, это соответствует углу

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
|\alpha |\leq \pi /4,<br />

косинус этого угла будет

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
|\cos \alpha| \leq \frac{\sqrt{2}}{2}.<br />

В этом случае функция может выглядеть так:
Pascal
1
2
3
4
5
6
7
8
9
function arccos(x: real): real;
const margin: real = sqrt(2) / 2;
begin
 if x < -margin
   then arccos := pi + arctan(sqrt(1 - x * x) / x)
   else if x < margin
     then arccos := pi / 2 - arctan(x / sqrt(1 - x * x))
     else arccos := arctan(sqrt(1 - x * x) / x)
end;
Всё хорошо и правильно, но... Мне не нравится. Что-то как-то длинновато, что ли... Попробуем по-другому. Можно вычислить arccos(x) несколько проще, если воспользоваться формулой

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\arccos x = 2\cdot \operatorname{arctg}\sqrt{\frac{1-x}{1+x}}.<br />

Здесь может возникнуть деление на 0 лишь в одном случае, при x=-1, и для большинства применений можно так:
Pascal
1
2
3
4
5
6
function arccos(x: real): real;
begin
 if x <> -1
   then arccos := 2 * arctan(sqrt((1 - x) / (1 + x)))
   else arccos := pi
end;
Чтобы избавиться от возможного переполнения при x→-1, можно поступить так же, как и до этого, искусственно разбив интервал области определения на две части. Если воспользоваться тем фактом, что

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\arccos (-x)=\pi - \arccos x,<br />

получим, на мой взгляд, наиболее оптимальный вариант функции:
Pascal
1
2
3
4
5
6
function arccos(x: real): real;
begin
 if x > 0
   then arccos := 2 * arctan(sqrt((1 - x) / (1 + x)))
   else arccos := pi - 2 * arctan(sqrt((1 + x) / (1 - x)))
end;
Лучше (более универсально) использовать не тип real, а тип extended. Можно, конечно, и double, но... Смысла особенного это не имеет, поскольку в современных диалектах паскаля машинное представление для типов real и double одинаковое.

Лирическое отступление, для предвосхищения необдуманных вопросов. Да знаю я, что функция arccos(x) не определена при |x|>1, и в таком случае должна генерироваться ошибка. Можно было бы в вышеуказанные функции ввести дополнительные проверки, выдавать соответствующее сообщение, и прекращать работу программы. По моему мнению, это как-то... Тавтологией попахивает, что ли... Поэтому я написал функции так, чтобы генерировалась стандартная ошибка. Во всех приведённых функциях при |x|>1 будет иметь место попытка извлечения квадратного корня из отрицательного числа, и будет вызван стандартный обработчик для недействительной операции для чисел с плавающей точкой.
3
1 / 1 / 0
Регистрация: 01.10.2017
Сообщений: 7
03.10.2017, 14:33
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Вы, в стремлении помочь, нашли это решение от какого-нибудь псевдо-гуру, да и опубликовали его здесь, не особенно проверив.
Я нашёл его в исходниках Delphi, хотя там он немного по-другому реализован (с помощью вычисления через fpatan), я просто скопировал формулу из комментария, не особо думая.
Вот так короче и работает всегда без проблем (хотя автору вопроса вряд ли разрешат использовать ассемблер):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{$N+}
function ArcCos(const X : Extended) : Extended; assembler;
asm
  { ArcCos := ArcTan2(Sqrt((1+X) * (1-X)), X) }
  FLD   X
  FLD1
  FADD  ST(0), ST(1)
  FLD1
  FSUB  ST(0), ST(2)
  FMULP ST(1), ST(0)
  FSQRT
  FXCH
  FPATAN
end;
0
Модератор
10411 / 5698 / 3401
Регистрация: 17.08.2012
Сообщений: 17,351
04.10.2017, 00:30
Ну да... Внешний вид комментария, в данном случае, пожалуй, не поясняет, а только запутывает, поскольку вычисляется здесь вовсе не арктангенс, а так называемый частичный арктангенс, patan (англ.: partial arctangent), он же - PArcTan, он же - arctan2, который является функцией от двух аргументов. Команда сопроцессора fpatan фактически в качестве входных значений принимает координаты точки (X, Y), где X — абсцисса, помещаемая в ST(0), а Y — ордината, помещаемая в ST(1). Возвращаемая величина представляет собой угол в радианах между осью абсцисс и прямой, проходящей через центр координат и заданную точку, и операция деления при этом не выполняется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.10.2017, 00:30
Помогаю со студенческими работами здесь

Как правильно записать arcsin и arccos?
Помогите! В проге нужно использовать arcsin и arccos, а я не знаю как их написать на VB.

Как записать выражение С:=arccos(sqr(a)+sqr(b)+sqr(c))?
Как записать выражение типа С:=arccos(sqr(a)+sqr(b)+sqr(c))

Как вычислить arccos без калькулятора
Как вычислить arccos без калькулятора? Есть где нибудь формула? Я весь интернет перерыл ничего не нашел. Есть число 0.6 при arccos будет...

Как ввести в VBA arcsin, arccos
или arctg Подскажите, пожалуйста. Заранее спасибо

Как вывести подобную формулу для arccos(x), используя приведенную выше формулу?
Несомненно многие знают приближенную формулу arcsin(x) = x. Но есть подобная приближенная формула и при икс близком к 1. Выведем эту ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru