Názory k článku
Fixed point arithmetic
Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoOsobně se živím vývojem hardware, především pro digitální zpracování obrazových signálů a tam je podrobná analýza numerické reprezentace a jejího vlivu na algoritmus velmi důležitá součást návrhu. On je totiž podstatný rozdíl jestli implementace algoritmu spolkne 200K nebo 20M ekvivalentních hradel.
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknobitove polia sa daju pouzit skor inde.
Re: Snad lidé nezapomínají
celé vláknoNeco jineho je to u jednocipu, ktere mnohdy maji prave "bitove" pameti (spis registrove sady). Tam by se za int pouzity misto boolean melo strilet...
Re: Snad lidé nezapomínají
celé vláknoDnes assembler moderních procesorů je tak složitý, že kdo jej nechce studovat do hloubky, tak jej v zásadě nezná.
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoDneska optimalizovat assembler moderních procesorů na rychlost je machrovina, kterou zvládá jen málokdo. Mnohdy mnohem delší kód může proběhnout za zlomek času, než třeba třikrát kratší kód s mnohem méně instrukcemi.
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoJe to složitější, věřte mi. Existuje vícero důvodů proč je BT pomalejší a jediné co Vám mohu zaručit je, že v každém dalším procesoru, který Intel, či AMD vyrobí bude poměr rychlostí provádění BT a spol. versus AND/OR/XOR/TEST/rotace ještě více nepříznivější.
Jinak překladač dnes vygeneruje rychlejší kód, než průměrný assemblerista a to se ani nemusí moc snažit. Musíte ovšem mít dobrý překladač (to znamená vylučuje se gcc, borland, bere se v úvahu ms a především intel).
Re: Snad lidé nezapomínají
celé vláknoBTW, to je zvláštní, já měl za to, že TEST trvá stejně dlouho, jako BT, na Athlonu je obojí DirectPath instrukce s latencí 1, a že jen BT mem16/32 je VectorPath (což není dobrý nápad ve výkonnostně kritické části...). A myslím, že těch dobrých assembleristů bude docela dost. Koneckonců, toho optimalizovaného kódu zas tolik zapotřebí nebude.
Re: Snad lidé nezapomínají
celé vláknoOno v assembleru není proč psát (bavíme se o x86).
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknounsigned long long x(unsigned lo, unsigned hi)
{
return ((unsigned long long)hi << 32) | lo;
}
vyleze v gcc 4.1.0 tohle:
pushl %ebx
xorl %edx, %edx
movl 12(%esp), %eax
movl 8(%esp), %ecx
popl %ebx
movl %eax, %edx
movl $0, %eax
orl %ecx, %eax
ret
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoOstatně na jiných architekturách se jedná o docela běžné operace, někde (jednočipy) jsou dokonce podporovány i bitové mapy.
Re: Snad lidé nezapomínají
celé vláknoVlivem toho kompilatory prestaly instrukce INC a DEC generovat a v dalsi verzi procesoru si treba Intel rekne, ze kdyz jsou nepouzivane, tak je jeste vic zpomali.
BTW. ty shifty byly na prvnich verzich Pentia 4 taky velmi pomale (4 tiky) --- nebyly totiz v ALU (ktera bezela na dvojnasobne frekvenci), ale provadela je MMX jednotka. Od Prescotta vyse Intel snizil frekvenci ALU na frekvenci procesoru a pridal do ni shifty.
Re: Snad lidé nezapomínají
celé vláknoTakže výsledkem bude sada "vybraných" rychlých instrukcí, které budou mít dlouhé opkódy (ty Intel kvůli zpětné kompatibilitě nebude měnit) a cache bude pěkně vypadávat podobně, jako na RISCích :-))) Benchmarky (ty blbé, co pojedou samotné) budou házet vysoká čísla a při reálném nasazení, kdy se přepínají stovky procesů, to bude pěkně pomaličké...
Shifty byly hlavně pomalé třeba na 286, přesněji řečeno shifty o víc nez jeden bit. Tam se vyplácelo provést několikrát za sebou rol, než jednou rol cx. Z dnešního pohledu (pipelining, více ALU atd.) je to samozřejmě nesmysl, ale tehdá to opravdu fungovalo.
Re: Snad lidé nezapomínají
celé vláknoJinak klídek. INC a DEC pro registry jsou a byly stejně rychlé jako ADD SUB, takže Vaše skoky a cykly jsou ok. INC a DEC pro práci s pamětí byla o jeden takt delší a to ještě jen někdy, než ADD a SUB, dostal jste od diskutující před Vámi neúplné informace.
Dnešní procesory jsou RISCy!!! I když mají CISCovou sadu.
Re: Snad lidé nezapomínají
celé vláknoPokud uděláte test, který je limitovaný dobou výpočtu ALU (např. pořád se opakující INC EAX), tak naměříte, že je tam jedno, jestli je tam INC nebo ADD, protože druhá mikroinstrukce INC se provede paralelně s první mikroinstrukcí následujícího INC.
Pokud však uděláte test limitovaný propustností mikroinstrukcí (např. INC po sobě s různými registry), tak zjistíte, že je to dvakrát rychlejší, když tam místo INC dáte ADD.
Re: Snad lidé nezapomínají
celé vlákno1. Registr FLAGS je vlastne pouze sada jednobitovych klopnych obvodu, ktere vzajemne nemaji mnoho spolecneho - kazdy se nastavuje jinym zpusobem, nektery z ALU, jiny treba z radice preruseni.
2. Takze bity CARRY, ZERO a OVERFLOW jsou imho klopne obvody, ja bych je udelal asi jako klopnaky typu D, samozrejme s clockem.
3. Z toho vyplyva, ze pokud nejaka instrukce (INC/DEC) nechce nejaky z techto bitu nastavovat, staci proste jednim hradlem AND zablokovat clock a do daneho klopneho obvodu se nic nezapise.
Kde je ta komplikace? Vzdyt cela architektura x86 je hroznej bastl, kde jsou tisice zbytecnych obvodu jenom pro zachovani opravdu zbytecnych instrukci typu BOUND, ENTER a LEAVE.
Jinak mam jeste maly dotaz: co to znamena, ze dnesni procesory jsou RISCy? To se dneska rozlisuje podle toho, co procesor dela uvnitr? Myslel jsem, ze se bere do uvahy instrukcni sada, protoze jinak je RISCem prakticky i M68000 a deleni prestava mit smysl.
Re: Snad lidé nezapomínají
celé vláknoHodnota alokovanych registru se nikdy nemeni. Kdyz se provede instrukce, co do nektereho registru zapise, tak se alokuje novy registr a nova hodnota se do nej ulozi. Toto umoznuje out-of-order execution. Napriklad pri kodu:
MUL EBX
JC label
MOV EAX, [1234]
MOV [1238], EAX
ADD EAX,3
se zacne provadet MUL, JC a MOV EAX,[1234] stoji, protoze zavisi na jeho vysledku, a paralelne se zacne provadet MOV [1238], EAX (protoze tato instrukce alokuje EAX v novem registru, tak nijak neposkodi predchozi instrukce). Ten ADD EAX se dokonci drive nez predchozi MOV EAX, [1234], ale nevadi to, protoze kazda z techto mikroinstrukci pouziva jiny registr.
Pokud se po skonceni MUL zjisti, ze priznak C je nastaveny a JC se melo provest, tak se pouze zapomene soucasna tabulka alokace registru a pouzije se tabulka platna v bode te instrukce JC, cimz se zpusobi, ze procesor zapomene, ze instrukce za JC vubec provadel.
Na flagy se tenhle princip pouziva stejne jako na ostatni registry, napriklad ve vyse popsanem pripade jsou tam dve verze flagu, jedna po skonceni MUL a druha po skonceni ADD.
Pokud instrukce INC flag C nemeni, tak vznikne problem, teto instrukci nestaci alokovat novy registr na flagy a zapsat tam vysledek (jako to dela ADD), musi mit jako vstup dva registry (predchozi flagy a hodnotu) a zapsat dva registry (nove flagy a hodnotu). Na PentiuPro se jim jeste se specialnim hardwarem na tohle chtelo piplat (INC tam zere pouze 1 mikroinstrukci), na Pentiu 4 uz ne.
Jinak si muzes precist dokument na http://www.agner.org/assem/
tam jsou do detailu popsane vnitrnosti procesoru, je to asi nejlepsi dokument na toto tema. Neco se taky da vycist z optimalizacniho manualu intelu, ale tam je toho min.
Re: Snad lidé nezapomínají
celé vláknoTed uz tu komplikaci s priznaky chapu; zajimave je, ze takova 65C02 (pouzita v osmibitovem Atarku) mela INCy a DECy reseny tak, ze nastavovala taky vic priznaku, samozrejme vcetne ZERO.
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknomísto
PUSH EAX
PUSH EBX
(2 byty kódu, 4 mikroinstrukce)
napsat
SUB ESP,8
MOV EAX,[ESP+4]
MOV EBX,[ESP]
(8 bytů kódu, 3 mikroinstrukce)
Podobně pomůže, když se místo INC EAX (1 byte, 2 mikroinstrukce) použije ADD (3 byte, 1 mikroinstrukce).
Sekvence PUSHů je naopak výhodnější na Pentiu M, které má speciální hardware na práci se zásobníkem a PUSH tam sežere pouze 1 mikroinstrukci.
Těch instrukcí, které jsou rychlejší, když se rozepíšou na jednodušší instrukce, je na procesorech už celkem dost --- PUSHA, POPA, LOOP(N)(Z), JECXZ, BOUND, ENTER, LEAVE (pouze Intel, AMD ji má rychlou), INTO, BSR/BSF (na pentiu 1 je trvaly asi 70 tiků a bylo rychlejší ji přepsat pomocí FPU, na ostatních procesorech je rychlá), včecky řetězcové isntrukce vyjma REP MOVSD a REP STOSD (i když nevím, zda by nebyly rychlejší s pomocí SSE, neměřil jsem to).
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoJe to holt začarovaný kruh --- instrukce jsou pomalé, protože se nepoužívají, a nepoužívají se, protože jsou pomalé.
Re: Snad lidé nezapomínají
celé vláknoTo platí i na argument, že alignovaná data jsou lepší. Jsem fakt zvědavý, o kolik rychlejší by bylo šest po slovech perfektně alignovaných bitů než jeden bajt s flagy, když by těch struktur byly milióny...třeba nějaký oflagovaný složitý graf, co já vím. :-)
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoNakonec jsme prisli na to, ze to je logicke: algoritmus predpoklada realna cisla, pocitac zpracovava podmnozinu cisel racionalnich a to (v pripade doublu) jeste nahustenych v okoli nuly, cim dal od nuly, tim horsi presnost. Reseni - vykaslat se na doubly, udelat poradnou analyzu hodnot zpracovavanych algoritmem, vsechno prevest na fixed-point (nebo na zlomky) a cele to naprogramovat znovu.
Re: Snad lidé nezapomínají
celé vláknoTakový typický příklad, kde floating point aritmetika selhává, resp. kde se rozchází s myšlením programátora.
Kolik desetníků musíme položit na stůl, abychom získali jednu korunu? Odpověď nám dá (???) následující program:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
double x=0.0;
int desetniku=0;
while (x<1.0) {
x+=0.1;
desetniku++;
printf("%d %f\n", desetniku, x);
} return 0;
Ještě jedna poznámka: pro dvoukorunu (jako výslednou sumu) to funguje, stejně jako tak pro dvacetníky... a teď tuto jasnou chybu v návrhu hledejte v stotisíciřádkovém programu (on totiž v tuto chvíli printf() trošku podvádí).
Re: Snad lidé nezapomínají
celé vláknoNavic jak tak koukam, pisete to v Jave. Java pouziva pomerne nepouzitelnou normu realnych cisel, takze to by mel byt dalsi vystrazny signal pred podobnymi konstrukcemi (pokud nekdo nevi, co je na Jave spatne, pak napriklad kladna a zaporna nula.) Poucka rika, ze se nemaji pouzivat realna cisla dokud to neni nezbytne nutne a i pak je vhodne nejprve hledat reseni pomoci celych cisel. Toto je poucka z programovacich technik a zaroven ze zakladu pocitacove grafiky. To same dale plati pro signalni analyzy, fourierovy transformace a kompresni metody. Samostatnou kapitolou jsou pak numericke metody. Po absolvovani stejnojmenneho predmetu jsem ztratil vetsinu iluzi o vhodnosti pocitacu k matematickym uloham.
Nemohu tedy souhlasit s tvrzenim "kde se aritmetika rozchazi s myslenim programatora". Mozna by pomohlo upravit ho na "kde se aritmetika rozchazi s myslenim nedouceneho programatora".
Nektere problemy realnych cisel, na ktere si vzpomenu:
1. porovnani na konkretni hodnotu nebo interval
V realnych cislech se casto objevuji hodnoty jako 0.000001 nebo 0.999998 apod. Porovnani by tedy mela byt intervalova a brat v uvahu zobrazovaci schopnost datoveho typu. Tedy napriklad:
misto "a == 1" pouzit "ABS(a - 1) < 0.0001"
misto "a < 1" pouzit "a < 0.99999"
Jina metoda, zpravidla narocnejsi ale intuitivnejsi, je prevadet podle zobrazovaci schopnosti na cela cisla (s matematickym zaokrouhlenim) a pracovat s nimi. Pokud tedy mantisa dokaze zobrazit napr. 5 cislic, pak rekneme, ze spravne zpracuje nejvyse tisiciny:
misto "a == 1" pouzit "ToInteger(a * 1000) == 1000"
misto "a < 1" pouzit "ToInteger(a * 1000) < 1"
2. omezena mantisa (rozlisovaci schopnost)
Realne cislo je uvadeno formou mantisy a exponentu, naprikla 0.025 bude uvedeno jako 2.5*10^-2. Ulozeno bude tedy napriklad cislo 25000 (mantisa) a exponent (-002). Toto se podle ruznych norem lisi, ale vzdy je tam mantisa s omezeou delkou - tedy cela cisla z intervalu 0 az napr. 99999.
Efekt A: nelze zapsat cislo 1.00001, protoze se proste nevejde do mantisy (moc dlouhe)
Efekt B: prakticky to same, ale je to mene patrne: 1 + 0.00001 != 1.00001 prave proto, ze 1.00001 nelze zapsat. Velice efektni chyba pri iteracnich vypoctech ve vypocetni geometrii.
3. Nektere formaty obsahuji zapornou nulu
4. Nektere formaty nedobre nasobi a jeste vice jich spatne deli - duvodem je, ze tyto formaty neukladaji mantisu jako BCD cislo, ale jako binarni cislo. A zkuste si napsat jako binarni cislo jednu petinu (0.2)
... atd., problemu a tedy duvodu nepouzivat realna cisla je mnohem vice. Pokud je nekdo presto pouzije, pak by si mel rizik a zakladnich metod byt velice dobre vedom.
Re: Snad lidé nezapomínají
celé vláknoV tom ostatnim mate naprostou pravdu, i kdyz ona existence kladne a zaporne nuly se v nekterych pripadech hodi.
Re: Snad lidé nezapomínají
celé vláknoPorovnani == jste nepouzil, ale pouzil jste < 1. To je to same. Porovnani na 1 se nema pouzivat, protoze hodnota nemusi byt presne 1, ale nejak kolem (napr. 0.99998 nebo 1.00001). Kazdopadne toto plati i pro porovnani < 1, protoze opet - hodnota muze byt napriklad 0.99998. Jinak receno, podminka < 1 je ekvivalentni podmince NOT(>= 1) a zde rovnitko je a byt nema. Takze v pripade podminky "< 1" je odkaz na chybu "porovnani na konkretni hodnotu" opodstatneny.
A ze to nekdy funguje a nekdy ne je dano tim, zda pocitac tu hodnotu 0.1 (nebo jinou) trefi shora, presne nebo zespoda.
Kazdopadne mam pocit, ze oba dva uskali realnych cisel v pocitacich zname a chapeme. Nezbyva nez si prat, aby tomu tak bylo i u vsech ostatnich, kdo programy pisi. Napriklad u vami zminovane externistky :-)
Re: Snad lidé nezapomínají
celé vláknoJeště štěstí, že Visual Basic a spol. (brr) má typ Currency, jinak bych se taky nemusel dočkat žádných úroků :-)))
Re: Snad lidé nezapomínají
celé vláknobitove reprezentace obou floatu a pak by podobna rovnost mela smysl.
Re: Snad lidé nezapomínají
celé vlákno0,1+0,1==0,2
V tom je prave nejvetsi problem s FP, protoze neplati nektera zakladni pravidla (resp. vlastnosti), jako je asociativita a komutativita operaci.
Re: Snad lidé nezapomínají
celé vláknoDále bych se připojil ke komentáři výše, že perfektní znalost této problematiky je nezbytná jednak v numerické matematice, jednak v hardwarařině. Naprostá většina měřících nebo jiných zařízení a modulů zpracovávající různé signály či veličiny převedené na elektrické je realizována pomocí 8-bitových jednočipů, případně 16-bitových DSP, a zde se skutečně jejich tvůrci bez znalosti těchto faktů a umění algoritmy dokonale zoptimalizovat neobejdou. Neboli neřekl bych, že je toto téma nějak opomíjeno, ale je pravdou, že ve světě PC opomíjeno je, a to velmi často. Druhou věcí ovšem je, kolik lidí píšící programy pro PC lze skutečně nazvat programátory a kolik z nich jsou jen programátorští nedoukové.
Re: Snad lidé nezapomínají
celé vláknoExternistka: to je jednoduché, jedna velmi chytrá paní, která se programovat naučila kdysi dávno ve Fortranu. V té době samozřejmě nic jako semináře programování neexistovaly, takže se to dá pochopit (a dále si myslím, že tu chybu by udělalo tak 90% absolventů dnešních fakult). Pokud se chcete ptát, proč to psala zrovna externistka; to je složitější. Zaprve danou problematiku znala resp. se ji byla ochotna naučit a za druhé se (samozřejmě) jednalo o peníze, protože mladší by to odmítli za tu cenu udělat.
Jinak ohledně DSP a jednočipů naprostý souhlas, i když v této oblasti jsem už viděl mnoho "borců", co programovali na 8051 nebo HC11 v céčku a vůbec si neuvědomili, že jen FP modul (který IMHO zbytečně použili) zabírá víc paměti, než jejich aplikace.
Re: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoRe: Snad lidé nezapomínají
celé vláknoZobrazení binárního čísla desítkově
celé vláknohezký článek. Chtěl bych Vás požádat ještě o vysvětlení algoritmu pro převod dvojkového čísla na desítkové. Myslím, že by se to k tomuto článku hodilo.
Děkuji.
Re: Zobrazení binárního čísla desítkově
celé vláknoRe: Zobrazení binárního čísla desítkově
celé vlákno1 2 3 = 3*1 + 2*10 + 1*100 = 3*(10^0) + 2*(10^1)+ 1*(10^2) stovky desitky jednotkyKdyz si uvedomis, ze takhle se vlastne zapisuje cislo, pro vsechny soustavy uz je to pak stejne. Napr. pro dvojkovou soustavu
0 1 0 1 osmicky ctyrky dvojky jednotky 0101 = 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 = 1*1 + 0*2 + 1*4 + 0*8 = 5Pro sestnactkovou soustavu
2 9 A(=10) dvestepadesatsestky sestnactky jednotky 29A = 10*16^0 + 9*16^1 + 2*16^2 = 10*1 + 9*16 + 2*256 = 666atd pro dalsi soustavy. Doufam ze je to srozumitelne.
Re: Zobrazení binárního čísla desítkově
celé vláknoale teraz vazne. kto si cita takyto clanok, mal by take trivialne veci ovladat. urcite to nie je nieco co by v nom malo byt specialne vykladane.
Re: Zobrazení binárního čísla desítkově
celé vláknoDobrý den,
myslíte "klasický" převod řetězce dvojkových číslic na desítkovou hodnotu?
Dělá se to následovně: řetězec dvojkových číslic se zapíše do tabulky, kde jsou ke každé pozici bitu vypsány i jejich váhy (desítkově). Potom se sečtou pouze ty váhy, u kterých je příslušný bit nastavený na jedničku, takže například pro řetězec 101010 bysme napsali:
bit váha vypočtená váha váha*bit 1 2^5 32 32 0 2^4 16 0 1 2^3 8 8 0 2^2 4 0 1 2^1 2 2 0 2^0 1 0 Celkem: ***42***
(btw, velmi důležitá kosmologická konstanta :-)
To stejné platí pro fixed point, pouze se změní váhy. Pro číslo 101.101 to bude:
bit váha vypočtená váha váha*bit 1 2^2 4 4,000 0 2^1 2 0,000 1 2^0 1 1,000 1 2^-1 0,5 0,500 0 2^-2 0,25 0,000 1 2^-3 0,125 0,125 Celkem: 5,625
Re: Zobrazení binárního čísla desítkově
celé vláknoNapříklad si mohu jednotlivým bitů přiřadit segmenty displeje a logická jednička pak znamená, že segment svítí. Číslici v dekadické soustavě je přiřazena taková kombinace, aby se zobrazila na displeji. Je možno jmenovat i Grayův kód, kód 1 z N a další.
Pokud však není uveden typ kódu, uvažuje se vetšinou právě přirozený binární.
Teda. To je klasika
celé vláknoB.A.Popov, G.S.Tesler
Výpočty funkcí na EVM
(Vyčislenie funkcij na EVM - Kiev, Naukova Dumka - 1984)
Pro toho, kdo se věnuje hard core věcem bez nároků na tuny paměti a potřebuje dosáhnout různou přesnost s různými, ale potřebnými náklady, je to dobrá kniha.
Pak je ještě jedna. Tu musím vyhrabat z archivu a ta je pro fajnšmekry.
Věnuje se výpočtům cifra za cifrou. Žádný koprocesor jen základní operace, posuny a manipulace s bity. Po přelouskání této knížečky máte ten správný pocit. Tedy něco v tom smyslu - už vím jak to funguje.
Dnešní koprocesory jsou na těchto věcech hodně postaveny a odvedou poctivou práci.
Proto je není potřeba zavrhovat.
Čauky
Re: Teda. To je klasika
celé vláknoRe: Teda. To je klasika
celé vláknoRe: Zobrazení binárního čísla desítkově
celé vláknoLze to dělat dělením 10^n, kde je n od nejvyššího řádu k nejnižšímu,ale to je zdlouhavé. Určitě existuje nějaký postup, kdy by stačilo násobit a dělit 2, a přičítat a odečítat nějaké malé číslo.
Otázka zní, jak zobrazit binární číslo na displeji desítkově.
Stačil by mi algoritmus na převod BIN -> BCD, protože BCD lze jednoduše zobrazit.
Děkuji za odpověď.
Re: Zobrazení binárního čísla desítkově
celé vláknoJe to sice trošku hardwarově orientováno, ale ten hlavní problém tam mají vyřešený, tj. použití shiftů a bitových operací místo násobení.
Re: Zobrazení binárního čísla desítkově
celé vláknohttp://sourceforge.net/projects/k-map
netreba ani poznat minimalizaciu a karnaughove mapy. len si naklikaj pre kazdy bit pravdivostnu tabulku a solve ti vypluje logicke operacie na jeho prepocet.
Re: Zobrazení binárního čísla desítkově
celé vlákno1) vynásobím súčasnú hodnotu medzivýsledku dvomi, medzivýsledok si už udržiavam v BCD -na to by tam mala byť priamo inštrukcia, alebo aspoň inštrukcia, ktorá po vynásobení (rolovaní) upraví výsledok tak, aby bol opat v BCD tvare
2) pripočítam ten bit z prevádzaného čísla (a opať upravím medzivýsledok tak, aby bol v BCD tvare)
A to je všetko... na konci mám BCD tvar čísla
pekny clanek
celé vláknoPrave planuju v jednom svem programu pro praci s obrazky rozsireni pro HDR (high dynamic resolution), tzn. vic nez 8 bitu na barvu - myslel jsem si, ze na barvu proste pouziju tri floaty a bude vymalovano, ale asi si pockam na dalsi dily clanku :).
Re: pekny clanek
celé vláknoRe: pekny clanek
celé vláknoRe: pekny clanek
celé vláknoRe: pekny clanek
celé vláknoRe: pekny clanek
celé vláknoopen hardware
celé vláknoVhodny programovaci jazyk pomuze
celé vláknoPIC S9(9)V9(2) COMP
a hned nam tam krasny (dekadicky) FXP funguje. A clovek uz na to nemusi vubec myslet. Traduje se, ze v tomto jazyce je napsana stale jeste vetsina software.
Jo jo, COBOListu uz dnes clovek najde malo. Skoda...
Re: Vhodny programovaci jazyk pomuze
celé vláknoEdsger Dijkstra
Selected Writings on Computing: A Personal Perspective
Re: Vhodny programovaci jazyk pomuze
celé vláknoA jinak taky: "Fact 30: COBOL is a very bad language, but all the others (for business applications) are so much worse."
Robert L. Glass
Facts and Fallacies of Software Engineering
Re: Vhodny programovaci jazyk pomuze
celé vláknoTeoretický informatik a programátor se na ideálním programovacím jazyku nikdy nemohou dohodnout. Teoretik by rád matematickou eleganci, programátor by rád praktickou použitelnost => spor :-)
Re: Vhodny programovaci jazyk pomuze
celé vláknoRe: Vhodny programovaci jazyk pomuze
celé vláknoRe: Vhodny programovaci jazyk pomuze
celé vlákno1. vezmeme mnozinu vsech programovacich jazyku P
2. vezmem mnozinu vsech programatoru
3. kazda dvojice programatoru (system kazdy s kazdym bez ohledu na pohlavi :-) vybere jeden "spatny" jazyk
4. ten je nasledne vyjmut z mnoziny P
5. na konci ziskame pouze ty dobre ci idealni jazyky - akorat se obavam, ze vznikne neco takoveho P={} :-)))
Re: Vhodny programovaci jazyk pomuze
celé vláknoRe: Vhodny programovaci jazyk pomuze
celé vláknoPřesné počítání ve floating point
celé vláknoKdyby člověk třeba dělal něco jako síťový protokol DOOMa (počítače si posílají pouze akce jednotlivých hráčů a každý počítač provádí výpočet stavu hry sám), zda to vůbec má šanci fungovat mezi počítači různých architektur.
Jak moc dobře je to IEEE podporováno? Třeba Intel má instrukce fsin a fcos, které mají omezený rozsah vstupních hodnot, a zda je přesná náhrada v knihovně, to je otázka.
Re: Přesné počítání ve floating point
celé vláknoZdravím, myslím, že se definice blíží bit exact normě. Je definované i přesně, kdy má být vyhlášena výjimka a jak musí být výsledek zaokrouhlován. Norma je však dost složitá a obsahuje několik vyžadovaných režimů nastavení hlášení výjimek a zarovnávání. Myslím, že v podstatě žádný CPU ji do posledního puntíku neplní. Proto musí být pro zajištění plné kompatability doplněn kompilátor a CPU knihovnou. Protože dodržování všech pravidel zpomaluje, umožňuje většinou kompilátor testy a řešení krajních mezí explicitně vynechat, viz parametr GCC "-ffast-math".
Pro otestování splnění bitexact požadavků je často používán "paranoia" test, třeba viz:
Kahan's Floating Point Test "Paranoia"
Výsledek na Linuxu mi vyšel: The arithmetic diagnosed may be Acceptable despite inconvenient Defects.
Předpokládám, že autor článku má v oblasti širší znalosti a proto se těším na další pokračování, které přinese jeho pohled na problémy a zkušenosti s FP.
Re: Přesné počítání ve floating point
celé vláknoDOOM pouziva FP aritmetiku? Do zdrojaku jsem se nedival, ale pripadne mi, ze jeste na 386 bylo FPU docela pomala zalezitost, nehlede na to, ze to prece fungovalo i na "cisle" 386 bez FPU (teda jestli si to dobre pamatuju). Myslim, ze Carnac to sve slavne paralelni zpracovani CPU+FPU rozvinul az u Quaka.
Re: Přesné počítání ve floating point
celé vláknoDOOM myslim trochu FP pouzival, ale dost malo, ze to bylo mozno emulovat. Pridani koprocesoru pry DOOMa zrychlilo.
Quaka jsem jednou zkusil pustit se softwarove emulovanym FPU a udelal 0.5 snimku za sekundu (2 snimky, pokud jsem se podival do zeme a nebyly tam zadne vertexy).
Re: Přesné počítání ve floating point
celé vláknoRe: Přesné počítání ve floating point
celé vláknoRe: Přesné počítání ve floating point
celé vláknoNicmene podle stranky http://www.faqs.org/faqs/games/doom/RGCD-faq/ DOOM FPU nepouziva:
5A. Does DOOM benefit from a FPU for floating point calculations?
No. All calculations in DOOM 1.1 and beyond use integers. Hence,
DOOM does not suffer from the Pentium floating point bug in any way.

