Skocz do zawartości

[Delphi] problem z wersjami


Integer

Polecane posty

Witam.

mam fragment takiego kodu

 

function f_activate( const net: Single): Single;
begin
        Result:= 1.0 / ( 1.0 + exp( -net ) );
end;

 

Skompilowane w Delphi 5 działa bezbłędnie natomiast w Delphi 2007 wywołuje błąd

"Floating point overlow"

 

Moze ktos mial taki przypadek i zna lekarstwo :). Z góry dzięki.

Link do komentarza
Udostępnij na innych stronach

Hmm...

 

jak zamieniłem

 

Result:= 1.0 / ( 1.0 + exp( -net ) );

 

na

 

Result:= 1.0 / ( 1.0 + 2.71*net ) );

to wszystko było ok, tylko oczywiście dzianie inne

 

Program się kompiluje tylko przy wykonywaniu funkcji wyskakuje błąd.

 

błędy wyskakują gdy net przyjmuje wartości np: -2.76....; -7,89....

Link do komentarza
Udostępnij na innych stronach

Wstawiłem try except żeby wyłowić te wartości net dla których jest błąd, może różne typy zmiennych mają na to wpływ?

 

  tmp: Single;
  net: Extended;

begin
...
     // tbret[i+o_idx]:= f_activate( tbret[i+o_idx] );      // poddajemy nieliniowej funcji aktywacji
     try
        net:= tbret[i+o_idx];
        tmp:= f_activate( tbret[i+o_idx] );      // poddajemy nieliniowej funcji aktywacji
     except
        tmp:= 1/ net;   // to jest tymczasowo na czas awarii
        Form1.MInfo.Lines.Add('   błąd: '+#9 + FloatToStr( net ));
        Application.ProcessMessages;
     end;

     tbret[i+o_idx]:= tmp;      // poddajemy nieliniowej funkcji aktywacji
,2Ż;mŹwui'
  błąd:        -1,58823984675296E32
  błąd:        -5,47215608197587E31
  błąd:        -6,18432982725582E36
  błąd:        -5,30394521919187E35
  błąd:        -1,19643212770238E37
  błąd:        -2,61436800965066E35
  błąd:        -1,97880363852698E35
  błąd:        -8,48243446097378E35
  błąd:        -2,16253572217298E35
  błąd:        -5,57808864207901E36
  błąd:        -5,28823103765562E35
  błąd:        -1,26770040304986E37
  błąd:        -4,49681755065499E36
  błąd:        -1,28009124043542E37
  błąd:        -2,44550219781875E37
....
....

Link do komentarza
Udostępnij na innych stronach

Liczby, na których operujesz, są po prostu za duże - jeżeli podnosisz 2,7 do potęgi ponad 10^30 to nie ma się co dziwić ;) Są chyba jakieś dyrektywy kompilatora żeby nie wywalał tego błędu, ale wynik wtedy i tak nie będzie prawidłowy.

Etharnion - 2D RPG

Szukam grafika chętnego do współpracy przy projekcie.

Link do komentarza
Udostępnij na innych stronach

Rozumiem, ale jak się pozbyć tego błędu, kod skompilowany w Delphi 5 nie ma tego błędu, zapewne w jakiś sposób obcina nadwyżkę;

próbowałem zbyt duże wartości zamienić na

 

       try
        net:= tbret[i+o_idx];
        tmp:= f_activate( net );      // poddajemy nieliniowej funcji aktywacji
        // Form1.MInfo.Lines.Add('   ob: '+#9 + FloatToStr(net));
        // Application.ProcessMessages;
     except
        tmp:= 9999999999999999999;
        Form1.MInfo.Lines.Add('   błąd: '+#9 + FloatToStr(net));
        Application.ProcessMessages;
     end;
     tbret[i+o_idx]:= tmp;      // poddajemy nieliniowej funcji aktywacji

 

ale taki sposób psuje mi właściwości sieci neuronowej.

Link do komentarza
Udostępnij na innych stronach

ale taki sposób psuje mi właściwości sieci neuronowej.

To trochę pojedzie po wydajności, ale możesz użyć jakiejś gotowej klasy (albo sam napisać), która wykonuje operacje arytmetyczne na stringach (coś w stylu dodawania, mnożenia itd. pisemnego), wtedy nie będziesz musiał się za to martwić o wielkość liczby.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...