Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с модулем
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SkyRideR
Здраствуйте, вот модуль его задача перевести радианы в градусы и если косинус равен 0 значению тангенса должно быть присвоено -100, но на практике выводит совсем другое, не могу понять в чём дело, если не трудно помогите
unit math;
interface
function tg(alfa : real):real;
implementation
function tg(alfa : real):real;
begin
if cos(alfa) = 0 then tg:=-100;
tg:=(sin(alfa)*180/pi)/(cos(alfa)*180/pi);

end;
end.
volvo
Не понял... Зачем радианы в градусы-то переводить? Может, наоборот, градусы в радианы? Что передается в качестве параметра функции Tg? Градусы или радианы? Функции Sin и Cos ожидают как раз угла в радианах, если что...
ROCKMAN
А зачем нужно вот это условие: if cos(alfa) = 0 then tg:=-100;
все равно потом: tg:=(sin(alfa)*180/pi)/(cos(alfa)*180/pi);
подправь: if cos(alfa) = 0 then tg:=-100 else tg:=(sin(alfa)*180/pi)/(cos(alfa)*180/pi);
volvo
ROCKMAN, еще раз - специально для тебя: не надо вообще ни на что делить, читай внимательно второй пост, и не давай вредных советов.

Вот, к примеру, зачем ты результат вычисления sin и cos умножаешь на (180/Pi)? В этом какой тайный смысл?
ROCKMAN
Цитата(volvo @ 18.01.2008 13:21) *

ROCKMAN, еще раз - специально для тебя: не надо вообще ни на что делить, читай внимательно второй пост, и не давай вредных советов.

Вот, к примеру, зачем ты результат вычисления sin и cos умножаешь на (180/Pi)? В этом какой тайный смысл?


Так надо же, чтобы значению тангенса было присвоено -100, SkyRideR так писал
хотя задача внатуре неверная
SkyRideR
На сколько я знаю, пакскаль считает в радианах, а нужно чтобы после подключения модуля и вызыва функции он на экран выводил значение в градусах, а не радианах. и значение tg должно быть равно -100 в том случае если косинус равен 0
volvo
Ты на вопросы, заданные тебе НИКОГДА не отвечаешь? Тебя спросили, что передается в функцию Tg, радианы или градусы?

Добавлено через 4 мин.
И вообще, кто же сравнивает с нулем вещественные значения напрямую? Надо сравнивать отклонение от 0...
SkyRideR
должна градусы передавать
volvo
Значит:
function tg(alfa : real):real;
const R2D = 180 / Pi;
begin
alfa := alfa / R2D; { Переводим градусы в радианы }
if abs(cos(alfa)) < 10E-5 then tg := -100
else tg := sin(alfa)/cos(alfa);
end;

...
{ Вызов: }
WriteLn(tg(90) :3 :3);
Что теперь не так?
SkyRideR
Спасибо большое, вот только 2 вопроса < 10E-5 это откуда взято? и почему по модулю?
Yevgeny
Это очень маленькое число, 10 в минус пятой степени, если не ошибаюсь,
и abs(cos(alfa)) < 10E-5 значит, что если cos(alfa) попадает в эту погрешность, то условие будет выполняться, насать "=" можно тока когда работаешь с целочисленными типами (integer,...), а с вещественными это не катит, ибо у тебя это условие никогда не выполнится, это вроде бы происходит из-за разного представления цисел в памяти... Вот, но это не точно, пока кто-нить по опытней не подтвердит smile.gif
SkyRideR
ну в общем я всё подправил, и если чётко указать там 0, где 10Е-5 условие выполняется, так что работает на ура good.gif
Yevgeny
ну, значит это я что-то напутал... smile.gif
volvo
Цитата
и если чётко указать там 0, где 10Е-5 условие выполняется
До поры до времени... На другой машине и/или при использовании другого компилятора получишь проблему, но если тебе нравится сначала сделать проблему, а потом ее решать - то Welcome... Я предпочитаю не давать поводов для таких ошибок, и использую сравнение погрешности...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.