Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
1-12784
DDF
2003-04-22 10:40
2003.05.05
[Error] на значении Nil


6-12844
bomberman
2003-02-24 02:29
2003.05.05
Как соеденить два модема между собой


14-12936
slaj
2003-04-18 12:17
2003.05.05
Проблема закрытия доступа на ПК отдельного юзера в Win2000 при вк


1-12697
Zergling
2003-04-23 06:26
2003.05.05
Копия динамического массива


1-12763
Carmen
2003-04-22 08:02
2003.05.05
Как полностью изменить внешний вид DBLookupComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский