SIGnal Floating Point Error – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

SIGnal Floating Point Error – Pascal – Fórum – Programujte.comSIGnal Floating Point Error – Pascal – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
SamuelKo
~ Anonymní uživatel
8 příspěvků
23. 12. 2013   #1
-
0
-

Zdravím,

robím domácu úlohu na programovanie. Máme vykresliť graf lineárnej lomenej funkcie bod za bodom do grafickej plochy v Lazaruse. Keď však počítam funkčnú hodnotu ako y:= (a*x+b)/(c*x+d); tak mi vyskočí External: SIGFPE. Všetky hodnoty sú doubly, ktorým priradím hodnoty: počítacej premennej cyklu do x a prečítané inegery z editačných polí. SIGFPE nevyskočí vždy, ale odpozoroval som, že určite vyskočí, keď c=d alebo sa aspoň jedno z a;b;c;d rovná 0. Lenže všetko sú to doubly, takže by sa nikdy nemali rovnať, som z toho zmätený. Tuší niekto ako to vyriešiť? (okrem hintov: nepoužívaj lazarus, rád by som použil niečo iné alebo aspoň vykreslenie vyvolal v pyplote ale nesmiem použiť nič, okrem základného pascalu). Ďakujem

Nahlásit jako SPAM
IP: 88.212.37.–
Reklama
Reklama
lukas.balaz0
Super člen
23. 12. 2013   #2
-
0
-

Nerobím v pascale, ale myslím, že floating point error by mal vyskakovať vtedy, keď sa robí niečo, čo je matematicky nemožné. Pre y:= (a*x+b)/(c*x+d); mi napadá len to, že ak c=d=0, delí sa tam nulou. Skús to ošetriť a ak stále bude nejaký vstup, pre ktorý to padá, napíš ten vstup.

Nahlásit jako SPAM
IP: 213.215.106.–
SamuelKo
~ Anonymní uživatel
8 příspěvků
23. 12. 2013   #3
-
0
-

To som ošetril podmienkou if cx+d=0 then y=10^6, čo pre moje účely stačí, ale aj v takom prípade vyhodí SIGFPE. Nejde teda len o bod x=1. Ako klinec do rakvy: ak by aj išlo o bod x=1 teda div zero, nemal by to byť problém, lebo pascal to zvláda a výsledok si pamätá ako "inf" resp. "-inf" a okrem zaokrúhľovania s tým vie robiť prakticky každú operáciu. Ak výpočet y=ax+b/cx+d rozdelím na w=ax+b, z=cx+d, y=w/z tak SIGFPE referuje na riadok y=w/z.

Nahlásit jako SPAM
IP: 88.212.37.–
Matrix17
~ Anonymní uživatel
286 příspěvků
24. 12. 2013   #4
-
0
-

#3 SamuelKo
Mrkl sem na net a mělo by to být jak říká lukáš. Tj. dělíš nulou. Takže to ošetři a je to vyřešený.

btw. Nevím jestli jsem tě správně pochopil ale zdá se mi, že říkáš, že pascal zvládá dělit nulou. To je samozřejmě hloupost ale asi sem tě jen špatně pochopil.

Nahlásit jako SPAM
IP: 213.226.237.–
SamuelKo
~ Anonymní uživatel
8 příspěvků
24. 12. 2013   #5
-
0
-

Pointa je, že delenie nulou som ošetril a robí to stále. K tomu deleniu nulou... 

FloatToStr(1/0) = + Inf

Nahlásit jako SPAM
IP: 88.212.37.–
Matrix17
~ Anonymní uživatel
286 příspěvků
24. 12. 2013   #6
-
0
-

Možná by bylo lepší, kdybys ukázal ten kód. Tohle je vaření z vody. Ale to co si sem hodil není ošetření jen ukázka jak shodit program.

Nahlásit jako SPAM
IP: 213.226.237.–
SamuelKo
~ Anonymní uživatel
8 příspěvků
24. 12. 2013   #7
-
0
-

To nemalo byť ošetrenie :D toto je moje ošetrenie (je to objektové, preto tie rozmery plochy, ale chcem vám to ukázať v pôvodnej podobe): 
 

procedure hodnota(a,b,c,d,x: double);
begin
  if ((x-(Image1.Width div 2))*c+d)=0 then y:=1000000
  else
  w:= ((x-(Image1.Width div 2))*a+b);
  z:= ((x-(Image1.Width div 2))*c+d);
  y:= w/z;
  y:= y+(Image1.Height div 2);

end;

SIGFPE odkazuje na riadok v bolde.

Nahlásit jako SPAM
IP: 88.212.37.–
KIIV+42
God of flame
24. 12. 2013   #8
-
0
-

ten lazarus je priserna vec.. ani krokovat to evidentne neumi... a zobrazit co je v promennych v aktualnim kroku uz vubec ne... </sarkazmus>

Co je vubec ve w kdyz projde ta podminka ifu?

Co je v x? Je to vetsi nez polovina Width?

Co z? Kde to je definovane? (ostatne to same plati pro y)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
SamuelKo
~ Anonymní uživatel
8 příspěvků
24. 12. 2013   #9
-
0
-

Ospravedlňujem sa, že som to dostatočne nevysvetlil, ale všetky premenné (a;b;c;d;x;y;w;z) sú globálne doubly, ak prejde podmienka tak w je evidentne nenulové (vzhľadom na to, že sú to doubly, teda majú obmedzenú presnosť tak je tá podmienka prakticky zbytočná, lebo presnú nulu fakt nikdy nijak netrafíme). Celú túto procedúru vyvolávam v cykle pre i:=0 do Image1.Width, pričom i je longint a jeho hodnotu pred výpočtom priradím x. a;b;c;d sú parametre, ktoré načítam z editačného poľa a uložím do príslušných premenných. 

PS.: ja som za python, najradšej by som použil pyplot a hotovo. Bohužiaľ, som bol profesorkou uistený, že to je riešenie za 0b., takže sa môžem ďalej trápiť s asi najmenej user-friendly objektovým prostredím všetkých čias.

Nahlásit jako SPAM
IP: 88.212.37.–
KIIV+42
God of flame
25. 12. 2013   #10
-
0
-

prvni zkus to krokovani...

jinak chapu ze clovek, ktery se jako prvni ucil treba python, bere cokoliv, co ma nejake striktnejsi typy jako "unfriendly"

kazdopadne to nehaze errory pro nic za nic...

+ globalni promenne jsou vetsinou prasarna :)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Mircosoft+1
Věrný člen
26. 12. 2013   #11
-
0
-

Floating point error nastane, když překročíš rozsah reálného čísla. Nemusí to být přímo dělení nulou, stačí i něco dostatečně blízko nuly. Takže místo "if jmenovatel=0" dej třeba "if abs(jmenovatel)<1e-10" (tu konstantu jsem jen tak plácnul, skutečnou hodnotu si nastav tak, aby to fungovalo).

Nahlásit jako SPAM
IP: 194.228.20.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
SamuelKo
~ Anonymní uživatel
8 příspěvků
26. 12. 2013   #12
-
0
-

Veľmi dobrý nápad. Ale za predpokladu, že použijem napr. koeficienty 1,2,3,3 a obmedzujúcu konštantu 1e-1 a moja polovica šírky plochy (časť osi, na ktorej vykresľujem) je 300, tak maximálna hodnota čitateľa je 302 a minimálna hodnota menovateľa je 0,1. Najvyššia funkčná hodnota nie je viac ako 3020. Aj tak vyskočí SIGFPE. 

PS.: nemal by double jednoducho pretiecť?

Nahlásit jako SPAM
IP: 88.212.37.–
Mircosoft+1
Věrný člen
26. 12. 2013   #13
-
0
-

Není víc než 3020? Viděl jsi ty skutečné hodnoty 302 a 0.1 vypsané na obrazovce, nebo si jenom myslíš, že tam byly? To je, oč tu běží...

P.S.: Jestli se nemýlím, reálná čísla právě místo přetékání házejí errory.

Nahlásit jako SPAM
IP: 194.228.20.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
SamuelKo
~ Anonymní uživatel
8 příspěvků
26. 12. 2013   #14
-
0
-

302 je maximum, ktoré možno dostať zo vzťahu (x-(I1.W / 2))*a+b ak a=1, b=2, I1.W=600 a x je od 1 do 600. Menovaťeľ má ohraničenie 0,1, pretože to mám v podmienke ako "if abs(menovateľ)<0,1 then menovateľ=0,1". Double má horné ohraničenie 1,7e308. 

Nahlásit jako SPAM
IP: 88.212.37.–
Mircosoft+1
Věrný člen
27. 12. 2013   #15
-
0
-

Vidím dvě možnosti. Buď máš porouchaný procesor (krajně nepravděpodobné), nebo se ti do toho výrazu nějak dostala taková čísla, že to těch teoretických 302 a 0.1 nedá. Nech si skutečné hodnoty vypsat na obrazovku nebo použij krokování a watch, jinak chybu nikdy nenajdeš.

Nahlásit jako SPAM
IP: 37.48.39.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Mircosoft+1
Věrný člen
27. 12. 2013   #16
-
0
-

#7 SamuelKo
Jé, teď mi to došlo. Všechny ty příkazy za else musíš zabalit do begin - end, jinak do toho else bude patřit jenom ten první a všechny ostatní pojedou vždycky, včetně toho dělení.

Nahlásit jako SPAM
IP: 37.48.39.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
SamuelKo
~ Anonymní uživatel
8 příspěvků
27. 12. 2013   #17
-
0
-

Ja som idiot :D fakt to môže byť také jednoduché? :D zlé návyky z pythonu... Dik moc :) teraz už ošetrenie funguje a plotí to pekne :)

Nahlásit jako SPAM
IP: 88.212.37.–
KIIV+42
God of flame
27. 12. 2013   #18
-
0
-

#16 Mircosoft
jeste kdybych se ho na ten if neptal hned v mym prvnim prispevku :)

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Podobná vlákna

Wsprintf floating point problém — založil Štěpán

GPS souřadnice do floating point number — založil Anonymní uživatel

Signál ze zvukové karty — založil BlackHole

Nejde signal do monitoru — založil Nefaritus

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý