![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Real type [D7, WinXP]
Axis_of_Evil © (2005-09-26 16:50:00)вопрос =
0) x: Real;
if (x = 1.123) then;
очевидно неверно, т.к. точное равенство получается в
случаях, когда число представимо в виде конечной двоичной дроби.
1) x := 0.0;
if (x = 0.0) then;
можно ли так?
// будет ли х точным нулем? (аки константа +-infinity)
зависит ли от чего-либо? // cross-(platform/compiler)
Axis_of_Evil (2005-09-26 17:39:00) [1]мораль =
ошибка происходит при закидывании переменной типа Real (8 bytes)
в FPU (10 bytes), с типом Extended (10 bytes) проблем меньше
т.е.
===========
x: Extended;
y: Real;
begin
y := 1.12134;
x := 1.12134;
if (x = y) then
write('!');
readln;
===========
не выдаст '!'
но
===========
x: Extended;
begin
x := 1.12134;
if (x = 1.12134) then
write('!');
readln;
===========
работает
пример же
===========
y: Real;
begin
y := 1.12134;
if (н = 1.12134) then
write('!');
readln;
===========
не работает
что и трнбовалось осознать.
на вопрос топика не ответил:>
umbra (2005-09-26 16:55:00) [2]Если использовать нецеліе числа, то сравнивать их надо функциями
function SameValue(const A, B: Single; Epsilon: Single = 0): Boolean; overload;
function SameValue(const A, B: Double; Epsilon: Double = 0): Boolean; overload;
function SameValue(const A, B: Extended; Epsilon: Extended = 0): Boolean; overload;
из модуля Math