Integer Napisano Grudzień 2, 2010 Zgłoś Share Napisano Grudzień 2, 2010 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 More sharing options...
Adam27 Napisano Grudzień 2, 2010 Zgłoś Share Napisano Grudzień 2, 2010 U mnie ta funkcja na Delphi 2007 się kompiluje, więc problem musi leżeć gdzieś indziej. Poszukaj na googlach o tym błędzie i zobacz, co u Ciebie w programie mogło go spowodować. Etharnion - 2D RPG Szukam grafika chętnego do współpracy przy projekcie. Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Grudzień 2, 2010 Autor Zgłoś Share Napisano Grudzień 2, 2010 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 More sharing options...
Adam27 Napisano Grudzień 2, 2010 Zgłoś Share Napisano Grudzień 2, 2010 U mnie działa również z tymi liczbami które podałeś. Może ta funkcja jest wywoływana w pętli i się zmienna przepełnia? Spróbuj użyć debuggera. Etharnion - 2D RPG Szukam grafika chętnego do współpracy przy projekcie. Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Grudzień 2, 2010 Autor Zgłoś Share Napisano Grudzień 2, 2010 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 More sharing options...
Integer Napisano Grudzień 2, 2010 Autor Zgłoś Share Napisano Grudzień 2, 2010 dla przykładu jest ok dla: ok: 0,672720331422933 ok: 3,20575754067182 ok: -0,750010241488759 ok: -1,07739115910851 ok: 1,02716947002723 ok: 4,2709769561561 ok: -0,893351904521967 Link do komentarza Udostępnij na innych stronach More sharing options...
Adam27 Napisano Grudzień 2, 2010 Zgłoś Share Napisano Grudzień 2, 2010 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 More sharing options...
Integer Napisano Grudzień 2, 2010 Autor Zgłoś Share Napisano Grudzień 2, 2010 może spróbuje wszystko na Extended zmienić... też to nic nie daje.. nie mam pomysłu Link do komentarza Udostępnij na innych stronach More sharing options...
Adam27 Napisano Grudzień 2, 2010 Zgłoś Share Napisano Grudzień 2, 2010 To nic nie da - Extended ma zasięg do ok. 10^4900, a już 2,7^(10^4) wynosi ponad 10^4300. Wyższe liczby to dla programu po prostu nieskończoność. Etharnion - 2D RPG Szukam grafika chętnego do współpracy przy projekcie. Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Grudzień 3, 2010 Autor Zgłoś Share Napisano Grudzień 3, 2010 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 More sharing options...
Jason Napisano Grudzień 3, 2010 Zgłoś Share Napisano Grudzień 3, 2010 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 More sharing options...
Integer Napisano Grudzień 10, 2010 Autor Zgłoś Share Napisano Grudzień 10, 2010 Cześć. próbowałem na rożne sposoby i efekt jest różny ale daleki od zamierzonego, chyba pozostaje tylko ten sposób ze stringami. Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.