Форум: "Основная";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
ВнизНе строгое сравнение чисел Найти похожие ветки
← →
Leo^Sun (2003-04-22 07:35) [0]Уважаемые мастера, пдскажите идею как сравнивать числа до n - го знака т.е. 4.43645645465 и 4.43635499999
← →
MBo (2003-04-22 07:38) [1]if abs(X1-X2)<Eps
← →
Calm (2003-04-22 09:00) [2]На самом деле в D6 появилась специальная функция. В параметрах передаются сравниваемые вещественные числа и погрешность.
Как называется не помню, но точно есть.
← →
kostik78ua (2003-04-22 09:24) [3]Умножь оба числа на 10^n, округли и сравнивай:
if trunc(4.43645645465*10000000)>trunc(4.43635499999*10000000) then ...
← →
REA (2003-04-22 09:33) [4]function CompareValue(const A, B: Extended; Epsilon: Extended = 0): TValueRelationship; overload;
function SameValue(const A, B: Extended; Epsilon: Extended = 0): Boolean; overload;
function IsZero(const A: Extended; Epsilon: Extended = 0): Boolean; overload;
и т.п.
А выглядит оно так:
function SameValue(const A, B: Extended; Epsilon: Extended): Boolean;
begin
if Epsilon = 0 then
Epsilon := Max(Min(Abs(A), Abs(B)) * ExtendedResolution, ExtendedResolution);
if A > B then
Result := (A - B) <= Epsilon
else
Result := (B - A) <= Epsilon;
end;
← →
Anatoly Podgoretsky (2003-04-22 11:04) [5]Они ничего не знали про функцию ABS
← →
REA (2003-04-22 11:54) [6]Видимо какой-то потаенный смысл есть. Может быстрее работает.
← →
Tano (2003-04-22 21:25) [7]unit Math
function SameValue
Там можно задать эпсилон и еще чего-то (см.Help)
← →
Думкин (2003-04-23 05:34) [8]Но это немного не то.
5.789
5.791
5.798
Если до второго знака, то совпдают 2 и 3.
Если погрешность 0.003 то 1 и 2.
Поэтому
> kostik78ua (22.04.03 09:24)
ближе к теме.
← →
REA (2003-04-23 09:19) [9]А если 0.005, то 1 и 2 равны, что и есть правильно, т.к. 5.789 все же ближе к 5.79.
Тогда надо разобраться что значит до n-ного знака: с округлением или trunc?
← →
Silver_ (2003-04-23 09:57) [10]с округлением
if RoundTo(4.43645645465,-n) > RoundTo(4.43635499999,-n) then ...
для точности при округлении советую -n-1 (ну или -(n+1) :))
а для "супер" точности
case AnsiCompare(FloatToStr(a), FloatToStr(b)) of
-1: <a меньше b>
0: <a равен b>
1: <a больше b>
end;
смотри также
FloatToStr function
FloatToStrF function
FloatToText function
FloatToTextFmt function + F1
Удачи! :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c