Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Может я сошел с ума, а ну глянте???


Cossys ©   (2002-10-30 17:50:00) 

Ситуация, господа такая:
sw_plus:= ... ;
sab_plus:= ... ;

Минуточку! В РЕЖИМЕ ОТЛАДЧИКА ПРОВЕРЯЛ - ОНИ РАВНЫ, РАВНЕЕ НЕ БЫВАЕТ :-( ПОЧЕМУ ЖЕ КОД НИЖЕ ВЫПОЛНЯЕТ КОД ПОСЛЕ else, КОГДА ДОЛЖЕН ВЫДАВАТЬ "ВСЕ ТИП-ТОП!"
if (sw_plus = sab_plus) then
MessageDlg("ВСЕ ТИП-ТОП", mtError, [mbOk], 0)
else
MessageDlg("ФАКИН", mtError, [mbOk], 0);


kva   (2002-10-31 11:54:00) [1]

const
Delta=0.00001; //для сранения на равенство действительных чисел
function IsEqual(const R1, R2: Double; const Del: Double=Delta): Boolean;
//проверка на равенство действительных чисел с точностью Del
begin
Result := (Abs(R1-R2) <= Del);
end;

Пример использования:
if IsEqual(sw_plus, sab_plus, 0.01) then... //c точностью 0.01
или
if not IsEqual(sw_plus, sab_plus, 0.01) then... //c точностью 0.01
или
if IsEqual(sw_plus, sab_plus) then... //c точностью 0.00001
или
if not IsEqual(sw_plus, sab_plus) then... //c точностью 0.00001


myor   (2002-10-31 11:27:00) [2]

if ((sw_plus/sab_plus=1) and (sab_plus<>0))
then


MBo   (2002-10-30 18:27:00) [3]

http://www.delphikingdom.com/helloworld/reals.htm


Cossys   (2002-10-30 18:23:00) [4]

McSimm © (30.10.02 18:14)
Если интерисует сравнение с точностью до 2х знаков можно написать так:
if (Trunc(100*sw_plus) = Trunc(100*sab_plus)) then

о, спасибо, на много симпатичнее


Cossys   (2002-10-30 18:20:00) [5]

McSimm
Как это так???

Сделал, но как по мне - это ананизм (хоть и работает)
Label1.Caption:=FloatToStr(sw_plus);
Label4.Caption:=FloatToStr(sab_plus);

if (Label1.Caption = Label4.Caption) then
MessageDlg("ВСЕ ТИП-ТОП", mtError, [mbOk], 0)
else
MessageDlg("ФАКИН", mtError, [mbOk], 0);

to MBo
статью не нашел :-( Если у Вас есть, кинте на мыло, пожалуйста


kull   (2002-10-30 18:18:00) [6]

Да есть стандартные функции для сравнивания:

Math.CompareValue

в D6 есть - в других не смотрел.


kull   (2002-10-30 18:15:00) [7]


> McSimm © (30.10.02 18:11)
> Тип переменных?
>
> Сравнивать данные с плавающей точкой на равенство НЕПРАВИЛЬНО.

А на неравенство правильно? :)


McSimm   (2002-10-30 18:14:00) [8]

Если интерисует сравнение с точностью до 2х знаков можно написать так:
if (Trunc(100*sw_plus) = Trunc(100*sab_plus)) then

В общем случае для значений с плавающей точкой можно говорить только о приблизительном равенстве:
if (abs(sw_plus - sab_plus) < Eps ) then
где Eps - маленькое число


MBo   (2002-10-30 18:12:00) [9]

Вещественные переменные так сравнивать не стоит. Делай маленький допуск.
См., например, статью А.Григорьева "Неочевидные особенности..."
на delphi.vitpc.com


McSimm   (2002-10-30 18:11:00) [10]

Тип переменных?

Сравнивать данные с плавающей точкой на равенство НЕПРАВИЛЬНО.


Cossys   (2002-10-30 18:08:00) [11]

Юрий Федоров ©
Дельфа пятая...


Cossys   (2002-10-30 18:07:00) [12]


sw_plus = 179579.22

sab_plus = 179579.22

копеечка в копеечку... даже на форму в Лэйбел выводил, думал мож что-то в дебаге не то... а нэт! Не, ну вы такое видали


Юрий Федоров   (2002-10-30 18:04:00) [13]

И еще.
Если D6 то отладчик имеет св-во мягко говоря глючить и показывать неверные значения переменных


McSimm   (2002-10-30 17:57:00) [14]

В режиме отладчика чему равно выражение sw_plus = sab_plus в тот момент, когда они равнее не бывают.

Код полнее, описание переменных и разберемся. Сходить с ума не стоит :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо