Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];
ВнизМожет я сошел с ума, а ну глянте??? Найти похожие ветки
← →
Cossys (2002-10-30 17:50) [0]Ситуация, господа такая:
sw_plus:= ... ;
sab_plus:= ... ;
Минуточку! В РЕЖИМЕ ОТЛАДЧИКА ПРОВЕРЯЛ - ОНИ РАВНЫ, РАВНЕЕ НЕ БЫВАЕТ :-( ПОЧЕМУ ЖЕ КОД НИЖЕ ВЫПОЛНЯЕТ КОД ПОСЛЕ else, КОГДА ДОЛЖЕН ВЫДАВАТЬ "ВСЕ ТИП-ТОП!"
if (sw_plus = sab_plus) then
MessageDlg("ВСЕ ТИП-ТОП", mtError, [mbOk], 0)
else
MessageDlg("ФАКИН", mtError, [mbOk], 0);
← →
McSimm (2002-10-30 17:57) [1]В режиме отладчика чему равно выражение sw_plus = sab_plus в тот момент, когда они равнее не бывают.
Код полнее, описание переменных и разберемся. Сходить с ума не стоит :)
← →
Юрий Федоров (2002-10-30 18:04) [2]И еще.
Если D6 то отладчик имеет св-во мягко говоря глючить и показывать неверные значения переменных
← →
Cossys (2002-10-30 18:07) [3]
sw_plus = 179579.22
sab_plus = 179579.22
копеечка в копеечку... даже на форму в Лэйбел выводил, думал мож что-то в дебаге не то... а нэт! Не, ну вы такое видали
← →
Cossys (2002-10-30 18:08) [4]Юрий Федоров ©
Дельфа пятая...
← →
McSimm (2002-10-30 18:11) [5]Тип переменных?
Сравнивать данные с плавающей точкой на равенство НЕПРАВИЛЬНО.
← →
MBo (2002-10-30 18:12) [6]Вещественные переменные так сравнивать не стоит. Делай маленький допуск.
См., например, статью А.Григорьева "Неочевидные особенности..."
на delphi.vitpc.com
← →
McSimm (2002-10-30 18:14) [7]Если интерисует сравнение с точностью до 2х знаков можно написать так:
if (Trunc(100*sw_plus) = Trunc(100*sab_plus)) then
В общем случае для значений с плавающей точкой можно говорить только о приблизительном равенстве:
if (abs(sw_plus - sab_plus) < Eps ) then
где Eps - маленькое число
← →
kull (2002-10-30 18:15) [8]
> McSimm © (30.10.02 18:11)
> Тип переменных?
>
> Сравнивать данные с плавающей точкой на равенство НЕПРАВИЛЬНО.
А на неравенство правильно? :)
← →
kull (2002-10-30 18:18) [9]Да есть стандартные функции для сравнивания:
Math.CompareValue
в D6 есть - в других не смотрел.
← →
Cossys (2002-10-30 18:20) [10]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
статью не нашел :-( Если у Вас есть, кинте на мыло, пожалуйста
← →
Cossys (2002-10-30 18:23) [11]McSimm © (30.10.02 18:14)
Если интерисует сравнение с точностью до 2х знаков можно написать так:
if (Trunc(100*sw_plus) = Trunc(100*sab_plus)) then
о, спасибо, на много симпатичнее
← →
MBo (2002-10-30 18:27) [12]http://www.delphikingdom.com/helloworld/reals.htm
← →
myor (2002-10-31 11:27) [13]if ((sw_plus/sab_plus=1) and (sab_plus<>0))
then
← →
kva (2002-10-31 11:54) [14]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
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c