Jump to content

[Delphi] problem z wersjami


Integer

Recommended Posts

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...