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

Тема в разделе "Delphi - FAQ", создана пользователем KELA, 3 окт 2009.

  1. KELA

    KELA Гость

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

    [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()) поочерёдно - они одинаковые!

    Где логика?
     
  2. etc

    etc Гость

    У вас ошибка в программе.

    Сравнение на равенство вещественных типов в большинстве случаев бессмысленно.
     
  3. KELA

    KELA Гость

    Какая ошибка? Алгоритмы для поиска корней работают
     
  4. etc

    etc Гость

    Откуда мы знаем ... говорите неправильно считает - значит ошибка.
    Дебагером смотрели? В алгоритме уверены? А в его реализации?
     
  5. Mun2

    Mun2 Гость

    вот оно как ;)

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

    -2.22044604925031E-16

    E-16 ;)

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

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

    например
    Код (Text):
    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;
     
Загрузка...

Поделиться этой страницей