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á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).
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.
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ší.