Mali zakasneli offtopic za Nedeljka: napiši program koji rešava kvadratnu jednačinu. Nema sumnje da znaš dosta o matematici, ali IEEE754 je pravljen kako je pravljen i mnoge odluke su donesene da bi se sačuvalo što je više moguće izraza uobičajene matematike i pored fundamentalnog ograničenja da realnih brojeva ima neprebrojivo mnogo a FP konačno mnogo. Npr denornalizovani brojevi koji svima izgledaju nepoterebni (i komplikacija u procesoru, dodatni stageovi u FP pipelineu), omogućavaju da if (a!=b) c=1/(a-b), c ne bude Inf. Sa druge strane, FP aritmetika ne trpi razna tumbanja izraza tj dovodi do različitih rezultata, npr x^2/sqrt(x^3+1). Pomenuo si atn, ja ću tan. Po tamo nekoj teoremi ako hoćeš tan(Pi/2)=Inf2 treba ti Pi/2. Ali bedaka, Pi/2 nije racionalan broj što svi FP brojevi jesu), a moguće je dokazati čak i da se zaokruži sve kako treba, nećeš dobiti Inf. Takođe sam oblik izraza može daleko da utiče na to šta dobiješ pa da li je kriva FP aritmetika ili neko ko je smatra za realnu.
Takođe ne zaboravi kompajlere, koji su notorni po pitanju tumbanja FP izraza čak i bez pitanja, plus Intelova specijalka da double u registru ostaje na 80b, a kad se stavi u memoriju skreše se na 64b (i tu se može dokazati da dvostruko zaokruživanje sa 64 na 53 bita mantise može da napravi grešku na zadnjem bitu). Mogu da iskopam čitavu listu kratkih triperaških programa koji izbacuju nebulozne rezultate čim se malo čačnu opcije kompajlera ili su jezivo osetljivi na greške zaokruživanja. Npr Kahnovu sumacionu formulu pametan kompajler može sasvim da uništi jer "eliminiše nepotrebne izraze". Da su pitanju integeri jesu nepotrebni, ali ovde jok. Ili recimo broj se kvadrira, od njega se oduzme isti taj kvadrat, izračuna se kvadratni koren od toga i mesto nule dobije se NAN. Opet, problem nije u IEEE754 već u tome što kompajler čačka kod računajući da važi realna aritmetika.
Pre par godina meni su na ovom forumu rekli da nema šansi da nađem bagove u math.h, a Visual Studio 2008 ima jedan takav sočan, kriminalan bag da je to prosto fascinantno i to baš u sin(x) koju sam jednim malim krpežom dovukao da bude pristojnija (bez gledanja u disasemblirani kod, a po tome kako se manifestuje, rekao bih: kao od bede odrađena redukcija argumenta na osnovni interval). I onda neki iskusan programer kaže da math.h može da se uradi sa malo realne analize (Tejlorov polinom itd), takorekuć srednjoškolci.
Ako te zanima, mogu te uputiti na par knjiga koje se bave neki vrlo pipavim detaljima FP aritmetike i svom tom "dark side" tematikom, kao i razlozima zašto su neke stvari rešene kako su rešene (jel neko primetio da IEEE754 nema zaokruživanje OD nule već samo KA nuli?, ali je to ubačeno u najnoviju reviziju standarda, i to zbog decimalne, a ne binarne aritmetike). Takođe, elementarne funkcije sa FP aritmetikom su posebna priča gde ima gomila mesta gde može da se uništi tačnost (4 bita ili 1 decimalna cifra) iako je sve rađeno "zdravorazumski", a posledično stradaju i i identiteti tipa sin(x)=sqrt(1-cos^2(x)). Pow(x,y) kao exp(ln(x)*y) no comment, tako nešto je krajnje neozbiljno sem ako se sve kalkulacije ne rade u znatno većoj tačnosti (koliko većoj? za sada nije poznat odgovor).
Inače, ko misli da je rešavanje kvadratne jednačine lako, neka proba da napiše program koji će trpeti sve moguće varijante (sumanut odnos koeficijenata a a rešenja sasvim normalni brojvi, gubitak tačnih cifara, mesta gde se može desiti overflow i underflow tokom računanja..). Dobijeni program je sve samo ne trivijalan.
Sve je ovo suvo naglabanje i teranje maka na konac dok su u igri školski primerčići sa ulazima koji su fini, obično celi brojevi.
Ontoppic: zar ne beše ako su f i g analitičke funkcije i f(0)=g(0)=0, da je onda lim (x->0) f(x)^g(x)=1 ?
One word, one instruction, one cycle. RISC.