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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2010, 18:01   #1
Ybn2
Форумчанин
 
Регистрация: 18.11.2010
Сообщений: 183
По умолчанию Что-то не то с Sin на Delphi

Вкратце, столкнулся с проблемой, что как то Sin в Delphi считается не так или я что-то не понимаю. Вот пример для Sin:
Код:
 Label1.Caption:=FloatToStr (Sin(pi/2));
  Label2.Caption:=FloatToStr (Sin(pi));
  Label3.Caption:=FloatToStr (Sin(3*pi/2));
  Label4.Caption:=FloatToStr (Sin(2*pi));
а результаты:
1 - этот правильный
-5,42101086242752E-20 ???? а должно быть 0
-1 - этот правильный
1,0842021724855E-19 ???? а должно быть 0

Кто понял, объясните пожалуйста в чем фишка.

Последний раз редактировалось Ybn2; 17.12.2010 в 18:04.
Ybn2 вне форума Ответить с цитированием
Старый 17.12.2010, 18:43   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,760
По умолчанию

Цитата:
-5,42101086242752E-20 ???? а должно быть 0
Ответ правильный. Читать про точность и конечность представления чисел в компе, округление.

П.С. FloatToStrF({само число}, ffGeneral, {количество цифр после запятой}, 0)

Последний раз редактировалось p51x; 17.12.2010 в 18:46. Причина: П.С.
p51x вне форума Ответить с цитированием
Старый 17.12.2010, 18:50   #3
Ybn2
Форумчанин
 
Регистрация: 18.11.2010
Сообщений: 183
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
FloatToStrF({само число}, ffGeneral, {количество цифр после запятой}, 0)
Я это знаю, что результаты приближены к 0, как минимум говорит E степень в (-1), однако не 0, как нас всех учили. И это меня сегодня заставило задуматься, почему?

P.S. Ведь 1 и -1 считает точно?

P.SS Как же все таки правильно как нас учат или как считает компьютер? Очень нужно принять какое то решение!

Последний раз редактировалось AlDelta; 18.12.2010 в 10:16.
Ybn2 вне форума Ответить с цитированием
Старый 17.12.2010, 20:57   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,760
По умолчанию

Читать про точность и конечность представления чисел в компе, округление.

-5,42101086242752E-20 = - 0.00000000000000000005 - это фактически 0 флоата

Последний раз редактировалось p51x; 17.12.2010 в 21:07.
p51x вне форума Ответить с цитированием
Старый 17.12.2010, 21:48   #5
Ybn2
Форумчанин
 
Регистрация: 18.11.2010
Сообщений: 183
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Читать про точность и конечность представления чисел в компе, округление.
-5,42101086242752E-20 = - 0.00000000000000000005 - это фактически 0 флоата
Фактически, но не 0 !!!!!!А про точность Вам советую прочитать самому, а я читал, там все ясно описано как вычислялось "Пи" и почему оно в вычислениях не завершено (т.е. конца нет и надеются на наш ВЕК) и уж тем более как высчитать точно! Спасибо за ответ, но прошу перед тем как ответить - думать и не сбивать с мысли!

Последний раз редактировалось Ybn2; 17.12.2010 в 21:58.
Ybn2 вне форума Ответить с цитированием
Старый 18.12.2010, 09:15   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,760
По умолчанию

Цитата:
но прошу перед тем как ответить - думать и не сбивать с мысли!
[удалено...]. Читай предложения до конца! Я про Пи не слова не сказал.

Цитата:
А про точность Вам советую прочитать самому
Спасибо. Читал и ни раз. И знаю о ней побольше вашего.

Цитата:
Фактически, но не 0
Цитата:
FloatToStr converts the floating-point value given by Value to its string representation. The conversion uses general number format with 15 significant digits.
ЭТО 0! Фактически и практически.

Последний раз редактировалось AlDelta; 18.12.2010 в 10:13.
p51x вне форума Ответить с цитированием
Старый 18.12.2010, 09:52   #7
MrMorozko
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 115
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
const pi=3.14 ;
var a,b,c,d:real;
begin
 a:=Round(Sin(pi/2)) ;
 b:=Round(Sin(pi)) ;
 c:=Round(Sin((pi/2)*3))  ;
 d:=Round(Sin(2*pi)) ;
Label1.Caption:=floattostr(a);
  Label2.Caption:= floattostr(b)  ;
  Label3.Caption:= floattostr(c) ;
  Label4.Caption:= floattostr(d)  ;
end;
Может так?
MrMorozko вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
f(sin) в pascal A_Orlov Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2010 17:07
Таблица углов sin, cos, tg и т.д neme4ta Общие вопросы по Java, Java SE, Kotlin 2 02.04.2010 15:23
Оптимизация sin() на BASM InternetStranger Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 11.02.2010 00:56