ATmega 32 rychlé dělení dvou čísel

Dobrý den,

rád bych vyřešil problém, který momentálně řeším :

Mám ATmegu 32 a potřebuji co nejrychleji vyřešit početní úlohu a=b/c;

kde znám číslo např. a=0,666 a musím k tomu přiřadit příslušného dělence i dělitele. Množina čisel pro b = {0-999}, c = {0-999}.

Vyřešli jsem to následovně :

int a = 666, // 0,666*1000
b = 0,
c = 0;

for (b=1; b <= 999; b++)
{ for (c = (b+1); c <= 1000; c++)
{ if (((b*1000)/c) == a)
{ return 1;
}
}
}

Je to, ale příliš pomalé . V každém kole ciklu musí procesor dělit a já to potřebuji mnohem rychleji. Napadlo mě vytvořit si nějakou matici výsledků a podle pozice v této matici vybrat dělence i dělitele, ale nevím jak to provést v reálu.

Máte někdo nějaký nápad? Děkuji Laďa.

To je zvláštní zadání. Možná jdeš už od počátku špatnou cestou. Nechceš podrobněji nastínit kde a proč to potřebuješ? Jistě to musí jít nějak jinak.

Tabulkou by to šlo, ale zabere v ROM 4 KB. Jen nástin:

struct cisla { delenec; delitel; };
const struct cisla Tab[1000] = { { …,…}, {…vypočítat tabulku Excelem nebo programem } };
int GetDelenec(int a) { return Tab[a].delenec; }
int GetDelitel(int a) { return Tab[a].delitel; }

Mám čip VCO od AD, do kterého přes SPI naplňuji registry. Potřebuji generovat určitou frekvenci, a potřebuji spočítát celočíselnou složku registru, (INT) a reprezentaci desetiného místa FRAC/MOD. Při počítání té frekvence znám tu reprezentaci desetiného čísla a potřebuji k ní přiřadit příslušnou hodnotu FRAC a MOD, bohužel co nejrychleji (chci to přelaďovat).

F = 255,666 MHz
INT = 255;
(FRAC/MOD) = 0,666;

F= ( INT+ FRAC/MOD);

Nějaké nápady? :slight_smile:

A jde ti o to aby FRAC/MOD byla nejnižší možná kombinace nebo je to jedno a nebude to mít dejme tomu vliv na spektrální vlastnosti VCO-PLL ?

Polde mne jde jen o ten poměr, takže na nic jiného to vlastnosti nemá. Tudiž je jedno o jaká jde čísla.

Tady jsem našel něco k problematice FRAC PLL (jen pro info)
www.ieee.cz/mtt/soutez04/prace/Diplomov … pdf‎

Tak třeba začni tím že vynásobíš “a” nejvyšším dělitelem a pak výsledek i dělitele analiticky otestuj na společný celočíselný dělitel a pokud ho mají tak ho použij ke zkrácení v tom zlomku.

:arrow_right: administrator: přiloženy externí soubory
Diplomova_prace_Jan_Zela_2004.pdf (2.45 MB)

Možná se uloha dá zredukovat na určení čísla “c” takoveho že když jím vynásobíš poslední desetinné místo čísla “a” tak Ti výjde celé číslo.

Musím se přiznat, že vůbec nevím jak si to myslel :frowning:

Příklad:
FRAC/MOD=0.368
Tak najdes takovej MOD aby 0.008 * MOD= celé číslo

Takže potřebuješ převést desetinné číslo na zlomek.
a = 0,666
a = b / c

Nejjednodušší by bylo
b = a * 1000
c = 1000
a = 666 / 1000

Pokud z nějakého důvodu čísla ve zlomku musí být menší než 1000,
šlo by možná použít
b = a * 1000
c = 999
a = 666 / 999 s chybou na čtvrtém desetinném místě.

Pro srovnání:
Pro a = 0,445 vychází
445 / 999 = 0,44544

Tvoje smyčka našla první zlomek
33 / 74 = 0,44594
takže ještě o chlup horší.

To je super nápad, vyzkouším a uvidím. Zatím děkuji.