Tak FP umí přinášet zajímavé pasti. Pořád mi připadá, že se to na univerzitách stále dost ignoruje; potom na projektech vidím, že se FP používá jako reálná čísla. To ale není pravda, vůbec to nesplňuje spoustu vlastností reálných čísel.
Asi nejlepší je volba špatných násobků u jednotek v metrickém systému. To je čistý fail prakticky od začátku.
Jak to řešit při zachování rychlosti? Fixed point je kolikrát pomalejší, protože je děláno nad běžnými registry. A FPU zatím co vím nemá podporu fixed point (nebo aspoň ne na úrovni jazyků)
za mě: zachovat FP a používat ho (klidně i jako fast-math), ale je dobré dopředu vědět, co to může způsobit a kdy můžou být problémy a kdy nikoli. Třeba kladná/záporná nula, to se může hodit, práce s NaN v 90% mých programů stejně nenastane :-)
A nebylo by lepší zapnout alespoň AVX2 aby ten výsledný kód dával smysl pro tuto dekádu? Podle mě dnes nedává smysl kompilovat pro SSE2.
urcite to jde zapnout (klidne i AVX-512, akorat dneska uz je teplo a nemusi se tak topit), ale ty problemy jsou principialni a zustanou tam.
Díky za super článek.
Říkám si, že některé ty optimalizace by mohl překladač udělat, i když o to není žádán. Například nastavování errno - tam je přece většinou vidět, zda hned po té operaci program čte errno. Anebo zda dělá něco jiného, co by to errno mohlo zase změnit. Pokud se errno nekontroluje nikde, lze ho bezpečně nenastavovat, ne?
teoreticky jo. Ale například se může překládat jeden soubor .c do svého objektového souboru (.o) a překladač v tuto chvíli ještě netuší, s čím vším se to bude linkovat. Protože až po slinkování bude jasné, jak se nějaká funkce volá atd.
> zda hned po té operaci program čte errno
On ho nemusí číst hned ale třeba o pár úrovní jinde. Tam už překladač nemusí vidět.
A autoři překladačů musí přemýšlet jinak než normální programátoři. Bezpečná optimalizace nesmí změnit chování ani v extrémně obskurních a nepravděpodobných případech. Pokud to errno někdo někde může číst a je nějaká větev, která ho nezmění, tak tam tu hodnotu zapsat musí.
Druhá věc je samozřejmě to, že errno je historický relikt. Je to špatně z mnoha úhlů pohledu, jen se ho nejde jednoduše zbavit.