Главная страница
    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.47 MB
Время: 0.006 c
1-12713
levova
2003-04-23 15:39
2003.05.05
Буфер обмена


3-12618
jocko
2003-04-15 15:16
2003.05.05
Как создать экземпляр TADOConnection внутри dll или потока


8-12836
Shluz
2003-01-26 23:54
2003.05.05
Полноэкранное видео в Delphi


3-12621
DW
2003-04-15 14:33
2003.05.05
перехват SQL - запросов


1-12694
Valentino
2003-04-23 09:34
2003.05.05
Нужна помощь со списком.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский