Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Проблема с модулем

Автор: SkyRideR 18.01.2008 3:18

Здраствуйте, вот модуль его задача перевести радианы в градусы и если косинус равен 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 18.01.2008 3:41

Не понял... Зачем радианы в градусы-то переводить? Может, наоборот, градусы в радианы? Что передается в качестве параметра функции Tg? Градусы или радианы? Функции Sin и Cos ожидают как раз угла в радианах, если что...

Автор: ROCKMAN 18.01.2008 17:17

А зачем нужно вот это условие: 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 18.01.2008 17:21

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

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

Автор: ROCKMAN 18.01.2008 17:28

Цитата(volvo @ 18.01.2008 13:21) *

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

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


Так надо же, чтобы значению тангенса было присвоено -100, SkyRideR так писал
хотя задача внатуре неверная

Автор: SkyRideR 18.01.2008 21:57

На сколько я знаю, пакскаль считает в радианах, а нужно чтобы после подключения модуля и вызыва функции он на экран выводил значение в градусах, а не радианах. и значение tg должно быть равно -100 в том случае если косинус равен 0

Автор: volvo 18.01.2008 22:32

Ты на вопросы, заданные тебе НИКОГДА не отвечаешь? Тебя спросили, что передается в функцию Tg, радианы или градусы?

Добавлено через 4 мин.
И вообще, кто же сравнивает с нулем вещественные значения напрямую? Надо сравнивать отклонение от 0...

Автор: SkyRideR 18.01.2008 22:37

должна градусы передавать

Автор: volvo 18.01.2008 22:45

Значит:

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 18.01.2008 22:57

Спасибо большое, вот только 2 вопроса < 10E-5 это откуда взято? и почему по модулю?

Автор: Yevgeny 18.01.2008 23:16

Это очень маленькое число, 10 в минус пятой степени, если не ошибаюсь,
и abs(cos(alfa)) < 10E-5 значит, что если cos(alfa) попадает в эту погрешность, то условие будет выполняться, насать "=" можно тока когда работаешь с целочисленными типами (integer,...), а с вещественными это не катит, ибо у тебя это условие никогда не выполнится, это вроде бы происходит из-за разного представления цисел в памяти... Вот, но это не точно, пока кто-нить по опытней не подтвердит smile.gif

Автор: SkyRideR 18.01.2008 23:38

ну в общем я всё подправил, и если чётко указать там 0, где 10Е-5 условие выполняется, так что работает на ура good.gif

Автор: Yevgeny 19.01.2008 0:01

ну, значит это я что-то напутал... smile.gif

Автор: volvo 19.01.2008 0:40

Цитата
и если чётко указать там 0, где 10Е-5 условие выполняется
До поры до времени... На другой машине и/или при использовании другого компилятора получишь проблему, но если тебе нравится сначала сделать проблему, а потом ее решать - то Welcome... Я предпочитаю не давать поводов для таких ошибок, и использую сравнение погрешности...