![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Может я сошел с ума, а ну глянте???
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 в тот момент, когда они равнее не бывают.
Код полнее, описание переменных и разберемся. Сходить с ума не стоит :)