Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.05;
Скачать: CL | DM;

Вниз

Не строгое сравнение чисел   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
14-12898
alex134
2003-04-10 22:26
2003.05.05
Отладка


4-12980
Style
2003-03-03 12:36
2003.05.05
Статические объекты Windows


1-12688
просто Джо
2003-04-21 12:04
2003.05.05
Вот все тут спрашивают: как убрать полосу прокрутки...


4-12971
Я
2003-03-07 11:10
2003.05.05
Простой вопросик


1-12734
Cooper
2003-04-23 21:57
2003.05.05
Координаты указателя мыши в пределах Image