Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Nula na nulti stepen daje jedinicu, jos jedan sjajan bug

[es] :: Advocacy :: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug

Strane: < .. 1 2 3 4 5 6

[ Pregleda: 41589 | Odgovora: 115 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.pool.mediaWays.net.



+27 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 08:47 - pre 165 meseci
Citat:
Sir_Oliver: [...] OK su radjeni u spreadsheetu. Moje iskustvo je sledece: spreadsheet aplikacije su sjajne sto se tice interoperabilnosti [...]


*gnik, gnik* Vazduha…

Citat:
Yoba: [...] ali mi nije jasno zasto ti se podigne zeludac?


Da ne trujem dalje temu, evo ovde sam tiradisao:

http://www.physicsforums.com/showthread.php?t=204797

http://www.physicsforums.com/showthread.php?t=240568
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 08:56 - pre 165 meseci
Sale 123 je natrcao na nesto relano ovde, u cemu je zapravo upotrebna razlika uzmedju +/-Inf i NaN? Oba su showstoperi i oba su realno greske i oba ne mozes koristiti u daljim proracunima.

Sto se tice .NETa provericu sutra ali koliko me secanje sluzi

- System.DevideByZeroException kad podelis cellobrojnu vrednost sa 0
- NaN kad podelis 0.0/0.0
- sign(X)*Inf za X/0.0

u svakom slucaju nema bacanje exceptiona za deljenje nulom u float svetu, kao po specifikaciji. Medjutim ako pokusas da to iskoristis posle za nesto drugo natrcis na neki od System.ArithmeticException derivata, sto je po meni ok i upravo sprecava situacije o kojima pricate (da NaN/Inf zagade calculation flow)



[Ovu poruku je menjao mmix dana 12.09.2010. u 10:09 GMT+1]
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Yoba
Projektant

Član broj: 240687
Poruke: 121
*.dynamic.sbb.rs.



+11 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 09:31 - pre 165 meseci
>>Da ne trujem dalje temu, evo ovde sam tiradisao:


pazi, ja sam krenuo da citam lnkove ali tu ima puno txt, aj zipuj pa ukratko potkrati tvoju tvrdju sa pocetka teme.
 
Odgovor na temu

Sir_Oliver
Milan Jovanovic
Beograd RS / Aurora IL

Član broj: 2557
Poruke: 353

Sajt: www.novarepublika.com


+17 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 09:38 - pre 165 meseci

OK, ti si počeo da trokiraš, ja preživljavam "deja vu".
Časlave, taj stav "sam protiv svih", smo svi imali u nekom periodu života. Ja nešto što izračunam, mogu da pošaljem nekome na parčetu papira, sms-om, u txt fajlu, nebitno. Ali ako taj neko ume da koristi samo glupi Excel, pritom i tu zaglavi pokoji put, zašto da tom nekome komplikujem život (a posredno i sebi)? Vidim da si na tom forumu pisao kako si koristio i C, C++, Perl, Python, Matlab itd. OK, znam i ja programiranje u svim tim programskim jezicima (uklj. Fortran) i da koristim Matlab/Simulink, pa ne doživljavam kao hendikep to što moram da koristim Excel. Jbg, postoje neka pravila igre prvo u okviru tima u kojem radim i kraj.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
212.200.65.*



+2790 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 10:03 - pre 165 meseci
Vi kao da ne razumete o čemu pišem.

Ja uopšte ne raspravljam o tačnosti. Kome treba 5 a kome 25 značajnih cifara, to zavisi od primene. To je pitanje dužine mantise i ja o tome uopšte ne govorim. Ja govorim o (be)smislenosti rezultata.

Na linku sa vikipedije koji sam dao piše da postoje dve nule - pozitivna i negativna. Onda je logično da bude . Međutim, ostaje drugi problem, što je .

Citat:
Sir_Oliver: Ovo je banalizacija, primer ti nije dobar. Ako gledas malo siru sliku, svaki inzenjerski posao se bavi ovozemaljskim stvarima: imas gomilu ogranicenja - vreme, novac, resurse, tehnologije koje primenjujes, tehnologije koje razvijas i realizujes primenom postojecih tehnologija ... Beskonacnost je cista apstrakcija. Meni ako se u proracunu pojavi beskonacnost, to samo znaci da sam negde zeznuo stvar, tako da mi je sve jedno da li je + ili -.


Prvo, beskonačnost može da znači nešto sasvim realno, npr. da su dve linije paralelne itd. Drugo, dao sam primer koji arkustangensom prebacuje beskonačnost u konačnost. I šta onda, kad na navedeni način nećeš identifikovati grešku?

Citat:
Časlav Ilić: Promenljive su ti tipa double, a formatska direktiva u scanf() je %f (float) umesto %lf, tako da se unesene vrednosti pretvaraju u nešto proizvoljno. Kod mene kad unesem 1 i 1 dobijem rezultat 7,57⁻⁶. (Gde uopšte nađe da petljaš sa scanf() u jednoj ovakvoj probi.)


Hvala na ispravci. To je već nešto konkretno.

Citat:
Časlav Ilić: Tima je tačnost, u smislu o kojem Nedeljko govori, najmanje bitna. Proračuni na superračunarima obavezno rade na osnovu približnih matematičkih modela stvarnosti; recimo, postići tri sigurne cifre u odnosu na stvarnost (eksperiment) često je nedostižan cilj. Tako da ako program zaglavi u ove granične operacije u pokretnom zarezu, već je nešto debelo naopako pošlo mnogo pre toga.

(Podrazumevam da se misli na tehničke i prirodnonaučne proračune. Tamo gde je potreban i superračunar i tačna realna aritmetika — ne znam koje bi to oblasti bile — tu se ne koriste brojevi u pokretnom zarezu, već namenske aritmetičke biblioteke.)


Ne, ja uopšte ne govorim o tome da li nekome treba 3 a kome 33 sigurne cifre.

Ne mogu da shvatim da ne razumeju o čemu pišem ljudi kao što su Ivan, mmix i Časlave, koje za ove stvari prilično cenim. Ko bre priča o tačnosti?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 10:22 - pre 165 meseci
Pa ne razumem iskreno, ne foliram se. Sta je zapravo priroda tvog prigovora? Razumem tvoj matematicki stav o tome ali ne razumem zasto si toliko protiv IEEE standarda? On je sam po svojoj prirodi falican u odnosu na matematicki model pa ma sta ti radio sa njim. Mislim da preciznost i pominju iz tih razloga jer je float nista drugo do "emulacije" neprekidnog seta realnih brojeva. Sam format medjutim nije neprekidan, ima 264 prekida razlicitih duzina, ima i dve nule kao sto si pomenuo, under i overflow granice, itd i to su sve ogranicenja u odnosu na realni model sa kojim zivis i kojih si svestan i koje prihvatas kao posledicu dogovorenog standarda ili bolje receno kompromisa. Zasto je onda 1/0=Inf problem ako si svestan toga? Ako taj scenario tacke prekida predstavlja realan problem za tvoje proracune onda ces kompenzovati model, zar ne?
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Sale_123
C++ Developer
Wien

Član broj: 23293
Poruke: 219
*.teol.net.



+120 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 11:11 - pre 165 meseci
Citat:
Nedeljko: Ko bre priča o tačnosti?


Ja. I to se ne odnosi direktno na tvoj problem nego na ovo sto je Ivan rekao: "Kome je potrebna striktna matematicka reprezentacija, taj svakako ne koristi IEEE754."

Mislim da Ivan i Časlav Ilić nisu u pravu kada kazu da se koriste specijalne aritmeticke biblioteke za HPC. One se koriste u manjini i to BAS tamo gdje se mora i NE u cijelom programu nego samo u kriticnim djelovim, zato sto je ta emulacija MNOGO sporija od ciste FP aritmetike.

A sto se tice Nedeljko tvog prigovora, mislim da si u pravu. Umjesto Inf bi trebalo da bude NaN, mada u praksi (bar u HPC) veci problem stvara preciznost, nego to o cemu ti pricas.


...
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
212.200.65.*



+2790 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 11:27 - pre 165 meseci
Kada pominjete matematiku, očigledno mislite na realne brojeve kojih ima beskonačno, pa čak i neprebrojivo mnogo. Jasno je da se oni ne mogu na računaru modelirati tačno, već samo približno. To niko ne spori i realnost se mora prihvatiti (jer nema drugog izbora).

Međutim, upravo iz razloga što se izračunavanja moraju obavljati u ograničenoj tačnosti, a i ulazni podaci su tipično dobijeni merenjem u ograničenoj tačnosti, postoji oblast matematike koja se zove numerička analiza. To je teorija koja opisuje baš to, a uzima u obzir i efikasnost izračunavanja.

Zadatak implementacije pokretnog zareza treba da bude dobijanje približno tačnih rezultata, koliko to dopušta radu toj ograničenoj tačnosti, pri čemu se mogu praviti kompromisi između brzine i tačnosti. No, rezultat i dalje mora biti smislen, koliko je to moguće.

1/0+=+inf ima smisla, ali dolazimo do problema 1/(x-x)=+inf.

Recimo da su a i b neke veličine takve a<b. Međutim, u računaru su predstavljene istim zapisom, jer su vrlo bliske. Šta je rezultat izračunavanja arctan(1/(a-b))? Pa, +pi/2 umesto -pi/2, što je besmislen rezultat. U slučajevima kada se znak razlike ne može odrediti, rezultat delenja tom razlikom mora biti NaN.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net.



+7174 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 11:28 - pre 165 meseci
Postoji velika razlika izmedju INF i NaN tretmana.

Ako ostavite INF, radice korektno sva > ili < poredjenja sa standardnim kodom. Sa NaN je neophodan poseban tretman - dakle, opet if() statementi i ubijanje performansi zarad necega sto je u datoj aplikaciji krajnje nebitno.

Tipican primer je digitalna obrada signala, dakle klasicna inzenjerska primena - problem je sto se ti blokovi operacija sa poredjenjem izvrsvaju u petljama i/ili na nizovima brojeva, i neka dodatna logika za poredjenje bi bila losa po performanse - a ne dobija se nista bitno, jer ce i ovako i onako +INF rezultat na kraju biti odbacen negde.

Inace, moguce je sasvim lepo naterati FPU da vam baca exception pri floating-point deljenju sa nulom, ako vam to zaista treba - i onda mozete tu raditi sta god hocete...

Naravno, ubice performanse - ali ako su vam bitniji neki drugi aspekti, postoji resenje.

Nedeljko, razumem ja tebe savrseno sta ti pricas. Ta nekorektnost je prihvatljiva za aplikacije koje koriste IEEE754 format. Kao sto rekoh gore, cak postoji i resenje ako bas zelis drugaciji tretman deljenja sa nulom da ti FPU baci exception i da onda ti to promenis na NaN ako zelis. Mada, to isto sam mozes da uradis sa prostim poredjenjem.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
212.200.65.*



+2790 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 11:46 - pre 165 meseci
Razlike između inf i nan? Pa, evo nekih.

arctan(inf) = pi/2
arctan(nan) = nan

inf == inf
nan != nan
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
212.200.65.*



+2790 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 11:50 - pre 165 meseci
Citat:
Ivan Dimkovic: Tipican primer je digitalna obrada signala, dakle klasicna inzenjerska primena - problem je sto se ti blokovi operacija sa poredjenjem izvrsvaju u petljama i/ili na nizovima brojeva, i neka dodatna logika za poredjenje bi bila losa po performanse - a ne dobija se nista bitno, jer ce i ovako i onako +INF rezultat na kraju biti odbacen negde.


Opet se vezuješ za jednu cpecijalnu namenu. Koliko se ja razumem, to o čemu pričaš u DSP-u su FFT i još neke operacije nad nizovima realnih brojeva, gde ionako nema delenja, pa em što primer nije reprezentativan, em što se ne može tako usko da se gleda na opšti slučaj.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net.



+7174 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 11:57 - pre 165 meseci
Ne radi se samo o FFT-u, vec o bilo kom blok-deljenju i blok-poredjenju, gde radis sa gomilom vrednosti.

Takve su gotovo sve rutine u signal procesiranju - od FFT-a koji si pomenuo, do svih mogucih i nemogucih filtera, grupisanja signala, operacija sa vektorima, itd...

Bas zbog toga sto NIJE BITAN taj rezultat deljenja sa nulom, islo se na varijantu koja bi omogucila nepromenjeno ponasanje programa zbog performansi.

Sta da ti kazem, nisi ciljna grupa.

Za one kojima je to problem, predvidjeno je da FPU moze da baca division-by-zero exception... Ili uvek mozes da uradis:

Code:

for(i=0; i<2048;i++) {
  if(k != 0.0f) {
    array[i] /= k;
  } else {
    unsigned long nan = 0x7fc00000;
    array[i] = *(float *)&nan;
  }
}


^ Upravo zbog ovih IF provera je cela stvar nepozeljna u normalnoj primeni, a koliko su tranzijentni rezultati nebitni samo pokazuje cinjenica da vecina inzenjerskog i IT sveta jako lepo zivi sa INF rezultatom deljenja sa nulom.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
212.200.65.*



+2790 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 12:07 - pre 165 meseci
Vrlo loše napisan kod. Ovo je dosta bolje:

Code:
if (k==0) {
    for (int i=0; i<2048; ++i) {
        array[i] = nan;
    }
} else {
    float k1 = 1/k;

    for (int i=0; i<2048; ++i) {
        array[i] *= k1;
    }
}

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net.



+7174 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 12:15 - pre 165 meseci
Kod je samo tu radi poente (jasno je da poredjenje k treba maknuti iz petlje ako je konstantno, a jeste u ovom primeru).

A na nekim platformama je bolje inicijalizovati ceo niz sa NaN a onda deliti samo gde nije deljenje sa nulom - ako se delitelj menja (tipa ako se deli vektor sa vektorom)

U svakom slucaju, to su stvari koje nisu potrebne vecini.

Da ne pricamo da bi NaN tretman zakomplikovao sve ostalo, gde god se vrsi neko poredjenje i sl.

Kako tranzijenti i ovako i onako nisu bitni u tim aplikacijama, ljudi savrseno zive sa tim i imaju vece performanse izvrsavanja.

Onima kojima je to problem postoji tehnicko resenje da se deljenje sa nulom drugacije tretira.

Dakle, rasprava je besmislena, zato sto postoji resenje za one kojima se ne svidja default ponasanje.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
212.200.65.*



+2790 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 12:22 - pre 165 meseci
U kojoj to inženjerskoj primeni imaš delenje vektora vektorom?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net.



+7174 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 12:28 - pre 165 meseci
Vektor = niz brojeva.

U kojoj primeni? U bilo kojoj gde treba podeliti jedan niz brojeva drugim. Od 3D grafike, preko obrade signala....

Recimo ako treba da skaliras ulazni signal sa nekim faktorima skaliranja koji su u nizu, tako da se svodi na jednu operaciju mnozenja. Cesto je taj vektor sa mnoziteljima u stvari reciprocna vrednost (tj. zapravo se deli sa njim) pa u pripremi tog niza reciprocnih vrednosti imas problem potencijalnog deljenja sa nulom.

Ni u jednoj od tih primena ne postoji nikakva razlika izmedju NaN i +INF, jer ce biti iseceni na kraju.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
212.200.65.*



+2790 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 12:38 - pre 165 meseci
Znači, svodljivo je na množenje, ali ponekad neki glupan radi sa recipročnim vrednostima. To je pogrešan dizajn.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net.



+7174 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 12:44 - pre 165 meseci
Err.. ne.

Potpuno je nebitno da li mnozis reciprocnom vrednoscu, ili delis - situacije u kojima se susreces sa deljenjem sa nulom su iste, samo ce se desiti ili u procesu generisanja reciprocne vrednosti (1.0/x) ili u procesu deljenja.

Uopste ne zelim da ulazim u to sta je pogresan dizajn jer je to apsolutno besmisleno bez dodatnih detalja o samom algoritmu i platformi na kojoj se izvrsava. Nazivati nesto "pogresnim dizajnom" bez ikakvog znanja o algoritmu ili o platformi te o zahtevima nije nista drugo nego diskusija bez ikakvog smisla. Da ne pricamo da je sve to nebitno uopste za temu.

A poenta je da je u ogromnoj vecini inzenjerskih aplikacija rezultat deljenja sa nulom nije kriticna stvar pa da bude matematicki potpuno ispravan.

Za one KOJIMA TO JESTE problem, postoji resenje.

Dakle, postoji resenje za sve - ogromna vecina koristi podrazumeveno ponasanje, jer joj greska koja se desava u podrazumevenom ponasanju nije bitna a za rezultat imaju efikasan kod koji ne mora da zastaje svaki put i nosi se sa NaN vrednostima. Ona manjina kojoj to jeste problem, moze ili da koristi FPU exception, ili da sami obradjuju deljenje sa nulom u svom kodu.

Dakle, PROBLEMA NEMA.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
212.200.65.*



+2790 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 15:30 - pre 165 meseci
Citat:
Ivan Dimkovic: Err.. ne.

Potpuno je nebitno da li mnozis reciprocnom vrednoscu, ili delis - situacije u kojima se susreces sa deljenjem sa nulom su iste, samo ce se desiti ili u procesu generisanja reciprocne vrednosti (1.0/x) ili u procesu deljenja.


Nisi razumeo poentu. Nije stvar u tome da ti imaš vektor kojim treba deliti, ali da prvo izračunaš recipročnu vrednost, pa onda množiš njom, već da u startu radiš sa vektorom kojim treba množiti.

Kada izračunavaš vektor kojim treba deliti, ponegde možeš dobiti nulu, ali da si umesto toga računao vektor kojim treba množiti, dobio bi na tim mestima beskonačnost ispravnog znaka, tako da ni kasnije sa množenjem ne bi imao problem. Zato je to ispravan dizajn.

Vidiš, svojevremeno sam radio na jednoj grafičkoj aplikaciji, gde je bilo potrebno odrediti najmanji pravougaonik u kome leži neka Bezijeova kriva. Bezijeova kriva je parametarska kriva, kojoj su obe koordinate polinomi po parametru stepena ne većeg od 3, pri čemu se parametar kreće od 0 do 1. Dakle, trebaju mi minimum i maksimum polinoma na segmentu [0,1].

Ideja je bila da odredim konačan skup tačaka S takav da se minimum i maksimum na segmentu [0,1] dostižu u nekim od tačaka skupa S, a da onda odredim minimum i maksimum vrednosti u tačkama iz skupa S. Skup S se sastoji od tačaka 0, 1 i onih nula izvoda polinoma koje leže između 0 i 1. Dakle, skup S ima najmanje dve, a najviše četiri tačke. Jasno je da je i .

Kada se odredi izvod , onda za (pri čemu se uzima da je nule izvoda izražavaju numerički stabilnim formulama , . Naravno, treba voditi računa o delenju nulom i korenovanju negativnih brojeva.

Konačan kod bi mogao da glasi ovako

Code:
#define UPDATE_MIN_MAX(t0)\
float t = t0;\
float t1 = 1 - t;\
float A1 = t1*A + t*B;\
float B1 = t1*B + t*C;\
float C1 = t1*C + t*D;\
float A2 = t1*A1 + t*B1;\
float B2 = t1*B1 + t*C1;\
float f = t1*A2 + t*B2;\
\
if (f < min) {\
    min = f;\
} else if (f > max) {\
    max = f;\
}

void minmax(float A, float B, float C, float D, float &min, float &max) {
    if (A < D) {
        min = A;
        max = D;
    } else {
        min = D;
        max = A;
    }

    float alpha = -A + 3*B - 3*C + D;
    float beta = -A + 2*B - C;
    float gamma = -A + C;
    float delta = beta*beta - alpha*gamma;

    if (delta >= 0) {
        if (beta >= 0) {
            delta = beta + sqrt(delta);
        } else {
            delta = beta - sqrt(delta);
        }

        if (alpha*delta > 0 && fabs(delta) < fabs(alpha)) {
            UPDATE_MIN_MAX(delta/alpha)
        }

        if (gamma*delta > 0 && fabs(gamma) < fabs(delta)) {
            UPDATE_MIN_MAX(gamma/delta)
        }
    }
}

#undef UPDATE_MIN_MAX


Kod je imun na jednakost najviših koeficijenata sa nulom (kada izvod nije više kvadratna, već linearna jednačina) i sve vrste singulariteta, pod pretpostavkom da ulazne veličine nisu toliko velike da množenjem dolazi do prekoračenja opsega float tipa (tj. da se neće dobiti međurezultat +/-inf), što je u tom grafičkom programu ispunjeno. Da nije, koristila bi se ovakva funkcija, koja poziva prethodnu:

Code:
void huge_minmax(float A, float B, float C, float D, float &min, float &max) {
    float mx = 1;
    float A1 = fabs(A);
    float B1 = fabs(B);
    float C1 = fabs(C);
    float D1 = fabs(D);
    
    if (A1 > mx) {
        mx = A1;
    }

    if (B1 > mx) {
        mx = B1;
    }

    if (C1 > mx) {
        mx = C1;
    }

    if (D1 > mx) {
        mx = D1;
    }

    float k = 1/mx;

    minmax(A*k, B*k, C*k, D*k, min, max);
    min *= mx;
    max *= mx;
}


Prouči malo ove primere, pa će ti biti jasnije šta je dobar dizajn koda koji nešto računa.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net.



+7174 Profil

icon Re: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug12.09.2010. u 15:54 - pre 165 meseci
Nedeljko,

Tvoj primer je negde primenljiv, a negde nije - zato sto ti negde treba reciprocna vrednost za nesto drugo, pa mozes da je iskoristis i za ubrzavanje deljenja zato sto je dobijas "besplatno".

To zavisi od zahteva koji se traze od konkretne implementacije i njenih detalja, i kao sto rekoh, potpuno je besmisleno da ulazimo u raspravu oko svrzishodnosti toga "uopste" posto je "uopste" suvise nedefinisano. Nema nikakve poente, niti se bilo sta moze zakljuciti.

Prema tome, da, negde je moguce izbeci deljenje kompletno, a negde nije - negde ti je reciprocna vrednost potrebna za nesto deseto, itd...

U svakom slucaju, to je potpuno nevezana prica za IEEE754 format.

Jel imas mogucnost da promenis rezultat deljenja sa nulom? Imas.

Sta jos vise hoces?

Hoces da dokazes da jesi u pravu? Pa u pravu si - deljenje nulom je matematicki pogresno u IEEE754 formatu, ali je ta greska namerna zato sto je irelevantna za vecinu primena + omogucava vece performanse i manji kod. Za sve primene u kojima je bitno da rezultat deljenja sa nulom ne bude broj - videti recenicu 2 pasusa gore.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

[es] :: Advocacy :: Nula na nulti stepen daje jedinicu, jos jedan sjajan bug

Strane: < .. 1 2 3 4 5 6

[ Pregleda: 41589 | Odgovora: 115 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.