Anonymní profil Luboš – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Luboš – Programujte.comAnonymní profil Luboš – Programujte.com

 

Příspěvky odeslané z IP adresy 46.135.87.–

Luboš
Visual Basic › matematický problém
29. 12. 2021   #389429

#19 hlucheucho

Nejdřív bych chtěl ukončit moji otázku. Nejvíc se mi líbyla odpověď od Kit-a.
Jenom bych chtěl jeho poslední větu: "Tím převodem vznikne nepřesnost, která se dá dalšími operacemi zveličit." doplnit. 
Nechci nikoho poučovat, ale některé věci je asi potřeba připomenout.
Výpočty s reálnými čísly provádí mat. kooprocesor. Ten kromě datových typů Single(4 bajty) a Double(8 bajtů) použivý typ Extended (10 bajtů). Kooprocesor je implicitně nastaven tak, aby výpočty prováděl v této nejvyšší přesnosti.
U jednořádkového výpočtu kooprocesor načte první dvě čísla, převede je do typu Extended, provede násobení a výsledek uloží na vrchol svého zásobníku. Načte další číslo, převede je na typ Extended a vrchol zásobníku vydělí tímto číslem. Výsledek uloží do proměnné b, což znamená že jej musí převést z typu Extended na typ Double, tedy typ s menší přesností a provede zaokrouhlení.
U dvouřádkového výpočtu se výsledek po násobení zaokrouhlí a uloží do proměnné c.
Poté jej kooprocesor znovu načte, vydělí dalším číslem, zaokrouhlí a opět uloží do proměnné c.
V druhém případě se tedy zaokrouhlení provedlo dvakrát a tak vznikl sice malý, ale přeci jen rozdíl.

A ještě k úkolu od remmidemmi.
Pro jistotu jsem nahlédl do knihy Bity do bytu. Dříve narození asi tuto knihu znají.
Pro dělení je zde užit stejný algoritmus jaký uvedl hlucheucho. Podle mně by úplně měla stačit 8-bitová aritmetika. 
Hlavní výpočet (tedy odčítání hodnoty 10) by proběhl v registru a. 

Do a by se postupně ukládali bity 39 až 0

a=0
for x=39 to 0
nejdřív bych bity v a posunul do leva : a=a+a
zapsal bych aktuální bit: a(bit 0) = bit x
otestoval bych, zda je číslo menší jak 10
pokud ano, zapsal bych do výsledku nulu a přesunul bych se na začátek cyklu.
v opačném případě bych od a odečetl 10 a do výsledku zapsal jedničku
next x

Po ukončení cyklu zůstane v a zbytek po dělení - ten se zapíše jako BCD do výsledku
Pokud je výsledek dělení menší jak 10 tak se vše ukončí
V opačném případě se do bitů 39 až 0 zapíše tento výsledek a vše se opakuje.

Na svém počítači bych těch 40 bitů převedl do typu Extended, ten bych načetl do kooprocesoru a uložil do paměti jako datový typ BCD  :-) ale toto řešení mi asi neprojde  :-)

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý