Почему делафи считает что -2.2 = 0 ?

  • Автор темы KELA
  • Дата начала
K

KELA

#1
Вот часть кода

[codebox]var
Form1: TForm1;
a,b,e,error,x,n,t1,t2,x1,x2,i,k,c1,c2,c3,c4,a1,a2,tmp,errorF,koren,iter:REAL;
kor1,kor2,kor3,it1,it2,it3:real;
m1,m2,m3: RealArray;
t: integer;

implementation
// Функция подсчёта логарифма по основанию b
function MyLog(x, b: Real): Real;
begin
Result := ln(x) / ln:)rolleyes:;
end;

// Функция возведения в степень
function MySt(a,b:real):real;
begin
Result := exp(b*ln(a));
end;

// Функция F(h)
FUNCTION F(h:REAL):REAL;
begin
t1:=h*(MyLog(MySt(5, (2*h-8)/5), 10));
t2:=MyLog(25, 10);
F:=t1-t2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(floattostr(F(-1)); // ВЫВОДИТ -2.2*** !!!!!

[/codebox]


Корни функции F(h) ---- (-1) и (5) ТОЧНО!
При этих значениях t1 должен быть равен t2 (t1-t2=0)
Но в итоге получается, что F(-1) И F(5) РАВНЫ -2,2******

НО! Если от F(-1) или F(5) онять к примеру 0.0001 , то получается примерно 0 (точнее, -0.0001)

Что за фигня? Как такое может быть?

+ если в функции сравнить модули t1 и t2, он тупо не видит, что они равны! Хотя, выводя их через showmessage(floattostr()) поочерёдно - они одинаковые!

Где логика?
 
K

KELA

#3
Какая ошибка? Алгоритмы для поиска корней работают
 
E
#4
Откуда мы знаем ... говорите неправильно считает - значит ошибка.
Дебагером смотрели? В алгоритме уверены? А в его реализации?
 
M

Mun2

#5
вот оно как ;)

при вашем коде действительно 2.2......

-2.22044604925031E-16

E-16 ;)

что-то мне подсказывает, что это достаточно близко к нулю ;)

а сравнение вещественных, если уж и нужно, надо проводить с какой то точностью.

например
Код:
const MEps=1E-10;

function CompareDouble(a,b: Double):TValueSign;
begin
if ABS(a-b)<=MEps then begin Result:=0; EXIT; end;
if a<b
then begin Result:=-1; EXIT; end
else Result:=1;  
end;