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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2012, 21:22   #1
nEm1z1s
 
Регистрация: 01.05.2012
Сообщений: 5
Сообщение функции sin и cos

Я пока новичёк в программировании, но несмотря на это я недавно начал создавать калькулятор. И работая с функцией sin или cos, сталкнулся с такой проблемой: sin(180) или cos(90) они равны 0, но программа выдаёт число, отличное от 0, и записано оно в экспоненциальной форме. Ну в общем, кто работал с sin и cos должен меня понять.

Чтобы не путаться, речь будет идти ТОЛЬКО о sin. Так вот я тут начал думать, как можно сделать так, чтобы выдавал 0. Первое, что пришло мне в голову это floattostrf( ,ffFixed, ,n). Но оно мне сразу непонравилось, так как в ответе будет записано n-чисел после запятой и неважно оно какое (пример: 5,0000 если n=4).

Я начал дальше думать. И подошёл к такому решению:
Код:
x,y:real;
y:=sin(x);
if x=180 then y:=0;
Но другие значения X такие, как 360, -360 ... они не учтуться! А всех их таким способом учесть нереально. Я начал развивать свою мысль дальше:
Код:
y:real;
y:=sin(x);
if x mod 180 = 0 then y:=0;
Как видите я не написал, к какому типу относится x. Так вот, в этом коде всё нечего, кроме того, что, используя mod, х-целый тип (к примеру, integer). Но в дальнейшем, если мы захотим найти sin(36.89), то программа выдаст ошибку, так как х (как я понимаю) должен иметь вещественный тип. Так вот тут то у меня и проблема, как сделать так, чтобы программа работала нормально.

Значит, как я хочу сделать:
Код:
y:real;
y:=sin(x);
if (x содержит в себе запятую) then y:=sin(x) else
if x (не содержит запятую, те х-целый тип) mod 180 = 0 then y:=0 else y:=sin(x);
Ну вот как-то так. Надеюсь, что кто-то мне поможет! Просто я уже весь инет облазил и нечё не нашёл!
nEm1z1s вне форума Ответить с цитированием
Старый 01.05.2012, 21:38   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Достаточно было залезть в справку по математическим функциям в Дельфи.
Все тригонометрические функции работают с радианами, а не с градусами.
http://ru.wikipedia.org/wiki/Радиан
Похвально упорство, с которым вы пытались решить проблему.
Решение лежало на поверхности
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 01.05.2012 в 21:57.
BDA вне форума Ответить с цитированием
Старый 01.05.2012, 22:18   #3
nEm1z1s
 
Регистрация: 01.05.2012
Сообщений: 5
По умолчанию

Да кстати, забыл написать насчёт этих радиан и градусов. Я перевел радианы в градусы с помощью функции radtograd, предворительно подключив библиотеку Math. При этом cos(60) и sin(30) он выдает 1/2 - ну впрочем как и должно...

Вот только этот косяк с 0 при x=0+-180n для sinи x=90+-180n для cos (n - целое число).

Последний раз редактировалось nEm1z1s; 01.05.2012 в 22:22.
nEm1z1s вне форума Ответить с цитированием
Старый 01.05.2012, 22:39   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Да уж, странный глюк.
У меня выводит 0, если записываю вот так:
Код:
if abs(sin(degtorad(a)))<5.42101086242752E-20 then
memo1.Lines.Append(floattostr(sin(degtorad(a))))
else
memo1.Lines.Append('0');
Там получается сверх маленькое число, которое получается сравнить только с ним самим.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.05.2012, 22:51   #5
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Это не глюк это <плавающая точка>.
=master= вне форума Ответить с цитированием
Старый 01.05.2012, 23:00   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

=master=, можно чуть подробнее)
Почему не получилось сравнить с 0.000001, например?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.05.2012, 23:04   #7
nEm1z1s
 
Регистрация: 01.05.2012
Сообщений: 5
По умолчанию

ну, да... можно конечно и такой вариант рассматривать, но:
sin(0)=0;
sin(180)=-5,42101086242752E-20
sin(360)=1,0842021724855E-19
sin(540)=-3,79470760369927E-19
sin(720)=2,16840434497101E-19
как видно эти значения изменяются ...
nEm1z1s вне форума Ответить с цитированием
Старый 01.05.2012, 23:25   #8
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
Сообщение от nEm1z1s Посмотреть сообщение
ну, да... можно конечно и такой вариант рассматривать, но:
sin(0)=0;
sin(180)=-5,42101086242752E-20
sin(360)=1,0842021724855E-19
sin(540)=-3,79470760369927E-19
sin(720)=2,16840434497101E-19
как видно эти значения изменяются ...
надо как сказано выше "пихать" в радианах а не в градусах напишите вот это например sin(1.5707963) и это 90 градусов или (pi/2) оно вам покажет 1.
Воображение важнее, чем знания. (Albert Einstein)

Последний раз редактировалось dmitriegorovih; 01.05.2012 в 23:47.
dmitriegorovih вне форума Ответить с цитированием
Старый 01.05.2012, 23:30   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

В общем, такой костыль:
Код:
function trunczero(s: string): string;
var
  i: integer;
begin
  if pos(DecimalSeparator, s) > 0 then
  begin
    i := length(s);
    while (s[i] = '0') do
      dec(i);
    if s[i] = DecimalSeparator then
      dec(i);
    result := copy(s, 1, i);
  end
  else
    result := s;
end;
...
trunczero(floattostrf(sin(degtorad(a)),ffFixed,0, 8))
Функция trunczero удалит лишние нули в конце представления числа.
При подсчете эти получающиеся значения не должны влиять, так как они ОЧЕНЬ маленькие.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 01.05.2012 в 23:33.
BDA вне форума Ответить с цитированием
Старый 01.05.2012, 23:50   #10
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

а почему ffFixed? из доки Delphi пишут что должно работать
Код:
floattostrf(sin(degtorad(a)),ffGeneral,1, 7)
разве не работает?
Ps нет Delphi чтоб проверить
Reskov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
sin ,cos,ln,lg,exp,sqr и др. wanes101 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 22.10.2014 04:24
Пусть задано значение X. Найти первое из чисел sin X, sin sin X, sin sin sin X, ... , меньшее по модулю 10-4. hex_91 Visual C++ 1 28.04.2012 23:49
Паскаль Вычислить у - первое из чисел sin х, sin sin x, sin sin sin x, ..., меньшее по модулю 10-4 Kikikiss Помощь студентам 2 25.03.2012 13:58
Cos, Sin и непонятности с ними =\\ Zeraim Общие вопросы Delphi 3 25.07.2009 01:38