Matematika v robotice 14. Saturační aritmetika
22. září 2013 v 6:24 | Petr | Roboti a MatematikaKomentáře
Ten priklad v AVR asm je trosku tendencni - resi pouze jednu polovinu, ale budiz... V C bych to napsal asi takhle:
uint16 c = a + b;
if (c & 0xff00)
c = 0xff;
[2]: Nevím co je ta "druhá polovina" - předpokládáte že sčítáním dvou usnigned - tedy kladných čísel vznikne záporný výsledek ?
No a ten váš příklad je krásný, ale je na něm vidět jak C v kritických sekcích plýtvá výkonem - protože vy zjevně předpokládáte že A+B se sčítá v 16 bitovém rozlišení.
Na druhé straně dneska v době ARMů v ceně 16 nožičkové PICky - není důvod stresovat se assemblerem.
[2]:: nevšiml jste si ještě, že VŠECHNY články tohoto blogu jsou tendenční? Je to přeci jednoznačně dané jeho názvem - "nekorektní blog". Což je dobré chápat nejen směrem k nečtenářům, ale i k nebohým čtenářům. S čímž se ovšem někteří čtenáři smiřují těžce.
Asi dáme panu geekovi úkol saturačně sečíst signed 4bit numera:
7+(-1)=?
-8+(-1)=?
-1+(-1)=?
Do odečítání bych se raději nepouštěl, protože písemné odečítání je na moji hlavu moc. Už hodinu bádám nad odečítáním a fakt to nedávám. A totiž, i kdybych to nakonec pochopil, tak za půl roku to stejně nebudu vědět. Takže je mnohem lepší se bez takovýchto znalostí obejít. No, není lepší fungovat ve světě dvojkových doplňků a všechno jen sčítat?
[3]: Tou druhou polovinou myslim to, ze preteceni na "druhe strane" ma vratit hodnotu 127, coz Vase konstrukce neresi :-)
Jiste - C bude vzdycky mene efektivni, nez optimalizovany ASM kod - viz. Vas clanek o vykonu lidskeho mozku - byla by prece ostuda, kdyby prekladac C dokazal takovou specifickou zalezitost prelozit lepe :D
[4]: i vsiml a proto jsem reakci napsal ve stejnem duchu a - muzu Vas uklidnit - jsem s tim smireny. Dekuji za (nezadany) titul geeka, za ktereho se nepovazuji a na oplatku mam pro Vas jiny ukol - mejme dnes bezne pouzivany STM32F1xx - velmi rad bych videl Vase reseni v ASM, ktere vycte obraz z kamery OV2640 a ulozi ho ve formtu JPEG na SD kartu v souborovem systemu FAT32 do adresare rekneme /foto/
Abych predesel dalsim ofenzivnim poznamkam - chapu, ze assembler ma stale vyznam (konecknocu jsem na nem take vyrostl), muj prispevek pouze nabidl podobne "nekorektni" reseni problemu pro diskuzi nebo inspiraci...
Pablo [4]:: Tak pozor, teď došlo možná k politováníhodnému nedorozumnění, Vás za geeka rozhodně nepovažuji, tím úkolem jsem chtěl oslovit autora blogu.
Protože věc v blogu probranou prostě nechápu.
Např. - sčítání signed integer 4 bit:
-1 + 1 = 0
tedy: 1111 + 0001 = 0000
Nastaveny budou příznaky C i O a výsledek bude zcela správný.
Jenže podle geeka P.K., cituji:
"Tohle platí pro UNSIGNED integer - kde nám přetečení indikuje CARRY bit a OVERFLOW bitu si vůbec nevšímáme. To samé pro SIGNED Integer a 8 bitovou hodnotu :
C = A + B
IF OVERFLOW THEN C = 127"
Takže, pakliže tuto logiku uplatníme pro 4bitové číslo, tak:
-1 + 1 = 7
Z čehož nemám dobrý pocit.
[7]: eee, tak to se omlouvam za svoji trosku prudsi reakci... Ja si myslim, ze to je ok - v uvodu pan Kubac pise neco o 4 bitovem procesoru, pak by to fungovalo :-), akorat pak byl prechod na AVR...
Pablo: v poho.
A už to chápu, geek má pravdu, jako vždy. Ke generování overflow dojde pouze v těch potřebných ošemetných případech. Wiki: "Internally, the overflow flag is usually generated by an exclusive or of the internal carry into and out of the sign bit".
Takže je to OK a mé dotazy se stávají bezpředmětnými. Tak to má být :)
Komentáře jsou uzavřeny.
kolik taktů by ušetřila hw implementace v ALU