Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2008, 13:09   #1
Teleport
Пользователь
 
Регистрация: 04.06.2008
Сообщений: 32
Вопрос Тригонометрия

Здравствуйте!
пишу программку, которая должна вычислить sin, cos и tg.

Пользователь вводит значения в градусах в Edit1, и нажимает кнопку.
label1 выводит результат.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
a, itog: real;
begin
a:= StrToFloat(Edit1.Text);
a:= (a*pi)/180;
itog:=  sin(a);
Label1.Caption:= FloatToStr(itog);
end;
ввожу 90 - результат 1. Ввожу 0 - результат0
но вот никак не пойму - когда я ввожу 180 или 360
Программка выдает мне всякую ерунду
типа: 1,22460635382238E-16 или -2,44921270764475E-16
Teleport вне форума Ответить с цитированием
Старый 04.06.2008, 13:16   #2
igroman
Пользователь
 
Регистрация: 25.05.2008
Сообщений: 75
По умолчанию

Ну правильно, так и должно быть. Если вам нужно откинуть дробную часть используйте div, тогда программа будет выдавать целое число.
igroman вне форума Ответить с цитированием
Старый 04.06.2008, 13:22   #3
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Цитата:
Сообщение от igroman Посмотреть сообщение
Ну правильно, так и должно быть. Если вам нужно откинуть дробную часть используйте div, тогда программа будет выдавать целое число.
Просто синус 180 равен нулю..... Чтото тут не так....
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 04.06.2008, 13:28   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Карась Посмотреть сообщение
Просто синус 180 равен нулю..... Чтото тут не так....
Видимо просто pi не очень равно числу пи. Наверное стоит задать его поточнее и лучше вообще забыть о существовании типа real, всё делать через extended.
B_N вне форума Ответить с цитированием
Старый 04.06.2008, 13:30   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Чтото тут не так
ибо Sin - Returns the sine of the angle in radians.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.06.2008, 13:47   #6
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Ага.. понятно с чем связанно...

Код:
procedure TForm1.Button1Click(Sender: TObject);
Var Float : Extended;
begin
Float := Sin(StrToInt(Edit1.Text) * pi/180);
Label1.Caption := FloatToStrF(Float, ffFixed, 4, 6);
end;
Теперь результат выполнения совпадает с фундаментальными знаниями получеными в школе
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 04.06.2008, 14:09   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Карась, ну это ведь уже "бородатый анекдот" Обычное "нестрогое" равенство при использовании плавающей точки. Достаточно посмотреть, что вернёт просто sin(PI). Кстати, единственный способ получить так строго 0, которого удалось добиться - это интеловский фортран и шикарный тип REAL(16), он же quadruple precision. Всё остальное - округлять.
B_N вне форума Ответить с цитированием
Старый 04.06.2008, 17:16   #8
Teleport
Пользователь
 
Регистрация: 04.06.2008
Сообщений: 32
По умолчанию

ясненько, спасиб)))

Код:
FloatToStrF(Float, ffFixed, 4, 6);
это помогло))
Teleport вне форума Ответить с цитированием
Старый 04.06.2008, 17:51   #9
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

В модуле Math есть функция проверки на равенство нулю. Величина погрешности зависит от количества значащих цифр для каждого типа переменной. Перед выводом результата можно добавить следующее:
Код:
 if IsZero(itog) then itog:=0;
_Dmitry вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц