![Sad :(](./images/smilies/icon_sad.gif)
![2^{32} 2^{32}](/forum/latexrender/pictures/f19901f1c817ad846a411e6712e8db66.png)
Quindi non puoi moltiplicare 50.000.000 per 1527 e poi dividere per 64.
Però, se ti basta una granularità di regolazione di 100 Hz, puoi moltiplicare 500.000 per 1527, dividere per 64 e moltiplicare per 100, o più in generale:
![\Delta_\phi = \frac {\left \lfloor \frac{f_\text{out}}{100} \right \rfloor \times 1527} {64} \times 100 \Delta_\phi = \frac {\left \lfloor \frac{f_\text{out}}{100} \right \rfloor \times 1527} {64} \times 100](/forum/latexrender/pictures/7952cdae59a1909e7104741a6a648ca6.png)
Però la frazione
![\frac{1527}{64} \frac{1527}{64}](/forum/latexrender/pictures/a8b637c9caef2d31e778b3887a8122a9.png)
![\frac{2^{32}}{180\times10^{6}} \frac{2^{32}}{180\times10^{6}}](/forum/latexrender/pictures/b99167e4b815fdbf6d76836efc594bb4.png)
Una frazione che la approssima a meno di 0,1 parti per milione è
![\frac{3603}{151} \frac{3603}{151}](/forum/latexrender/pictures/f5727463500bf7e5f448916e2573355a.png)
![\Delta_\phi = \frac {\left \lfloor \frac{f_\text{out}}{100} \right \rfloor \times 3603} {151} \times 100 \Delta_\phi = \frac {\left \lfloor \frac{f_\text{out}}{100} \right \rfloor \times 3603} {151} \times 100](/forum/latexrender/pictures/ced82c4aacb34a424ef8944b5f57e975.png)
La routine della divisione intera (al posto dello shift a destra di 6 bit) non è poi così terribile. Si può anche eseguire. La precisione ottenibile è circa pari a quella dei float (a 32 bit), che hanno 7 cifre significative.
L'operazione dovrebbe risultare più veloce, e il programma più snello al non includere le routine di calcolo dei float.
Volendo arrotondare il risultato della divisione all'intero più vicino, anziché troncarlo, raddoppiamo numeratore e denominatore (riusciamo ancora a stare dentro i 32 bit), e aggiungiamo 1 al numeratore:
![\Delta_\phi = \frac {\left \lfloor \frac{f_\text{out}}{100} \right \rfloor \times 7206 + 1} {302} \times 100 \Delta_\phi = \frac {\left \lfloor \frac{f_\text{out}}{100} \right \rfloor \times 7206 + 1} {302} \times 100](/forum/latexrender/pictures/58b390870619dc5c6accec1c93996d81.png)
Magari potresti provare a fare una simulazione esaustiva su PC su tutte le frequenze da 100 Hz a 50 MHz, a passi da 100 Hz, e vedere che differenze ti danno il calcolo con i double, i float e quello con la frazione. Probabilmente sotto i 10 MHz i calcoli coincidono sempre. Bisogna anche vedere che precisione serve. Se andiamo oltre la precisione del quarzo che ti genera il clock, dovrebbe bastare.
Non ci sono i double nel compilatore che usi? O gli interi a 64 bit?
C'è un altro modo per fare le moltiplicazioni, spezzando moltiplicando e moltiplicatore in "parte alta" e "parte bassa" ed eseguendo quattro moltiplicazioni e tre somme:
![a\times b = \left ( a_{H} + a_{L} \right ) \times \left ( b_{H} + b_{L} \right ) = a_{H}b_{H} + a_{H}b_{L} + a_{L}b_{H} + a_{L}b_{L} a\times b = \left ( a_{H} + a_{L} \right ) \times \left ( b_{H} + b_{L} \right ) = a_{H}b_{H} + a_{H}b_{L} + a_{L}b_{H} + a_{L}b_{L}](/forum/latexrender/pictures/a514a4d05f5c721e75b1558ebf4b80fd.png)
Mi pare che così si riesca ad avere il prodotto su un numero doppio di bit (64 anziché 32 per esempio), ma non ricordo bene il procedimento.
![Ciao O_/](./images/smilies/Ciaone.gif)