Страница 1 из 1

Не могу сравнить сотые доли числа

Добавлено: 29 май 2008, 14:01
Dr_Grizzly
Всем привет! Такая ситуация, в таблице два текстовых поля, sum1 и sum2, в коде делаю следующее:

Код: Выделить всё

....
var
s:Real;
begin
....
s:=ABS(StrToFloat(Table1Sum1.text)-StrToFloat(Table1.sum2.text));

If s<>0.01 then
 ShowMessage('аааа');
...
end;
В отладчике я ставлю точку останова и смотрю что переменная s имеет значение 0.01
и она все равно выдает сообщение 'aaaa'

Второй вариант:

Код: Выделить всё

....
var
x,s:Real;
begin
....
x:=0.01;

s:=ABS(StrToFloat(Table1Sum1.text)-StrToFloat(Table1.sum2.text));

If s<>x then
 ShowMessage('аааа');
...
end;

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

Третий вариант

Код: Выделить всё

....
var
x,s:Real;
begin
....
x:=0.01;

s:=ABS(StrToFloat(Table1Sum1.text)-StrToFloat(Table1.sum2.text));

If FloatToStr(s)<>FloatToStr(x) then
 ShowMessage('аааа');
...
end;

Происходит что-то интересное, в большенстве случаев проскакивает, а иногда все же выдает сообщение.

Мне нужно что сообщение не выдавало.

Re: Не могу сравнить сотые доли числа

Добавлено: 29 май 2008, 16:00
somewhere
Тип Real имеет размер 6 байт, числовой процессор работать с такими данными не умеет. Для вещественных чисел допустимые размеры 4,8 и 10 байт (single, double и Extended) соответственно. При присваивании переменной Real значений, компилятор выделяет переменной не 6, а 8 байт что эквивалентно типу Double. Число 0.1 мифическое в двоичном понимании и может быть представлено в виде бесконечной двоичной последовательности. При расчетах даже если у вас получилось точно 0.1, последний бит числа в сопроцессоре может отличаться. Такое может произойти при оперировании с "бесконечно" представимым числами, либо числами разных порядков. Механизм работы с такими числами сопроцессора подробно описан в документации Intel. Исходя из этого операции сравнения с такими числами могут давать как верный, так и неверный результат. Как вариант решения можно предложить увеличить разрядность переменных до 10 байт, это увеличит ваши шансы на верное сравнение, но полной гарантии не даст. Попробуйте выберите другое число, например 0.1015625, либо то, которое представимо конечным числом битов.

Re: Не могу сравнить сотые доли числа

Добавлено: 30 май 2008, 07:24
Dr_Grizzly
Обалдеть!!! Вот это проблема! ))) А если переменную объявить как double? Поможет? А лучше наверное FloatToCurr???

Re: Не могу сравнить сотые доли числа

Добавлено: 30 май 2008, 09:31
Игорь Акопян
читать http://www.delphikingdom.ru/asp/viewite ... alogid=374 , офигевать, далее либо научиться с этим жить, либо менять работу ;)

Re: Не могу сравнить сотые доли числа

Добавлено: 30 май 2008, 13:13
somewhere
Сравнение таких чисел лучше выполнять на примере вхождения в малую "окрестность" числа

Re: Не могу сравнить сотые доли числа

Добавлено: 30 май 2008, 23:52
chur
Игорь Акопян, спасибо за ссылку.

Теперь я понял, почему эти плавающие числа мне сразу не понравились :D

Re: Не могу сравнить сотые доли числа

Добавлено: 31 май 2008, 01:27
MOTOCoder
Игорь Акопян писал(а):читать http://www.delphikingdom.ru/asp/viewite ... alogid=374 , офигевать, далее либо научиться с этим жить, либо менять работу ;)


Мда... Интересно.
Казалось бы - что может быть точнее компьютера? :)