Čvn 042006
 

Rutina, která nám vypočítá procentuální podíl mezi dvěma 32-bitovými čísly, která mohou reprezentovat čísla LBA sektorů.

Když jsem psal program MAKER, potřeboval jsem nějak zobrazit, kolik procent je z celého disku již naformátováno. Vzhledem k tomu, že se používá LBA číslo sektoru, klasické dělení dvou čísel nepřicházelo v úvahu, protože by to trvalo příliš dlouho. Nechtěl jsem zatěžovat uživatele, že bude koukat jen na dlouhá čísla a bude si to jen představovat.

Zeptal jsem se proto velkého mága Ziloga, který mi naznačil nějaký postup, ale u jeho výkladu jsem nebyl moc moudrý. Nakonec mi celý postup dokonale vyložil Baze, oběma borcům velice děkuji.

Postup výpočtu je poměrně jednoduchý a dává přiměřené výsledky. Má jistou nevýhodu, jeho početní rozsah je od 0% do 200%. Nelze jej tedy použít kdykoliv, ale na danou úlohu je perfektní.

Cílem je zjistit, z jakých menších částí (jejich procent) je hledaná hodnota složena. Například číslo 75 ze 100 je složena z 50 a 25. 100% si rozdělíme tak, že ho budeme dělit dvěma (v assembleru jednoduché). Bude to následující řada:

100, 50, 25, 12.5, 6.25, 3.125, 1.5625, …

A my se budeme snažit spočítat, z jakých těchto částí je naše číslo složeno. Číslo, které máme jako proměnlivou hodnotu, nazveme PARTIAL a číslo, které reprezentuje 100% (a které taky známe) nazveme TOTAL. Hodnotu, kterou chceme vypočítat, nazveme VYSLEDEK a bude mít počáteční hodnotu 0.

Odečteme PARTIAL-TOTAL. Je-li výsledek kladný (tj. PARTIAL se do TOTAL vejde a jeste zbyde) je z něho hodnota složena a VYSLEDEK=VYSLEDEK+100 a pak PARTIAL=zbytek. Pak TOTAL vydělime dvěma (bude 50%) a znova odečítáme, ale k dalšímu výsledku přičítáme jen 50 v dalším kole jen 25 atd. Vždy to číslo, které reprezentuje procentuelní stav čísla TOTAL.

Pokud bude výsledek odečítání záporný, pak z této hodnoty výsledek složený není a výsledku si nevšímáme, ale TOTAL vydělíme dvěma a PARTIAL necháváme být.

Zjišťujeme z jakých dílů čísla TOTAL je číslo PARTIAL složené a VYSLEDEK pak prostě zobrazíme. Čím je cyklů více, tím je výsledek přesnější.

Nyní rutina:

;vstupujici parametry:
;bcde = cislo aktualniho sektoru
;na adrese ENDSEC je cislo maximalni (tedy 100%)
PROCENTO:       ld      (PARTIAL),de    ;uloz si cislo
                ld      (PARTIAL+2),bc  ;do pameti
                ld      de,(ENDSEC)     ;zjisti si
                ld      bc,(ENDSEC+2)   ;cislo maximalni
                ld      (TOTAL),de      ;a to si uloz taky
                ld      (TOTAL+2),bc
                xor     a
                ld      (VYSLEDEK),a    ;vynuluj vysledek
                ld      hl,TABULKA      ;ukazatel na tabulku
                ld      b,7             ;7 hodnot
PROC2:          push    bc
                ld      ix,PARTIAL      ;ix=cast
                ld      de,(TOTAL)
                ld      bc,(TOTAL+2)    ;bcde=100%
                ld      a,(ix+0)        ;proved odecteni
                sub     e               ;TOTAL-PARTIAL
                ld      e,a             ;po jednotlivych
                ld      a,(ix+1)        ;bytech
                sbc     a,d
                ld      d,a
                ld      a,(ix+2)
                sbc     a,c
                ld      c,a
                ld      a,(ix+3)
                sbc     a,b
                ld      b,a             ;pokud je carry, je vysledek zaporny
                jr      c,PROC1
                ld      (PARTIAL),de    ;pokud je kladny,uloz vysledek
                ld      (PARTIAL+2),bc  ;na priste
                ld      a,(VYSLEDEK)    ;nacti jiz spocetene cislo
                add     a,(hl)          ;a pricti k ni hodnotu z tabulky
                ld      (VYSLEDEK),a    ;a uloz zpet pro dalsi kolo
PROC1:          inc     hl              ;posun se v tabulce
                ld      ix,TOTAL        ;cele cislo vydel dvema
                srl     (ix+3)
                rr      (ix+2)
                rr      (ix+1)
                rr      (ix+0)
                pop     bc
                djnz    PROC2           ;opakuj 7 krat
                ret

VYSLEDEK:       db      0
TABULKA:        db      100,50,25,12,6,3,1      ;tabulka hodnot procent

PARTIAL:        dw      0,0             ;cislo, ktere potrebujeme zjistit
TOTAL:          dw      0,0             ;hodnota, kterou odecitame

  3 komentáře na “Výpočet procent pro 32-bitová čísla”

  1. Cool!

    Po delší době na webu opět něco kapku nového (aspoň pro mne) a zajímavého (aspoň pro mne)…

  2. Ahoj Dexi, jsem rád, že alespoň jednomu člověku moje rutina připadá zajímavá. To mě těší.

  3. Jeste malickost – jde to udelat bez ztraty presnosti – misto odcitani stale puleneho totalu budeme odecitat porad ten samy total, ale dvojnasobit ten zbytek ;>.

 Zanechat komentář

Můžete používat tyto HTML tagy a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

This site uses Akismet to reduce spam. Learn how your comment data is processed.