On Wednesday 22 December 2004 15:43, Michele Mordenti wrote:
> Per la mia tesi sto' lavorando al router software click
> (http://www.pdos.lcs.mit.edu/click/);dovrei implementare dei moduli
per
> la qualita' di servizio e mi servirebbe una funzione che mi
restituisse
> il logaritmo per l'aggiornamento dell'allocazione di banda.
>
> Per avere buone prestazioni il tutto gira in kernel space, quindi
> purtroppo non ho ne' la cmath.h ne' le variabili float. Per il
> logaritmo ho provveduto con lo sviluppo in serie di taylor, ma non
> posso fare a meno delle variabili float.
[..]
>
> Idee?
> Suggerimenti?
Ho avuto un problema simile nella mia tesi di laurea.
Nel protocollo TCP dovevo esprimere una variabile (rho) come una
frazione del RTT, e quindi ho utilizzato un unsigned long tenendo conto
dei centoventottesimi del valore. Ad esempio se rho era 0.5 usavo 64.
Suppongo non so per quale motivo che tu possa fare un bagaglio simile
sfruttando le proprieta` dei logaritmi e gli sviluppi in serie di
taylor.
Brevemente:
Dovendo calcolare con precisione il risultato di 2^(rho+1)
ho pensato di dividere il valore di rho nella somma della sua parte
intera con la sua parte frazionaria, trasformando:
2^rho = 2^(rhoi + rhof) = 2^(rhoi) + 2^(rhof)
ed effettuando 2^rhoi con un semplice bit-shifting.
2^(rhof) puo` assumere un numero finito di valori, ad esempio se rhof e`
approssimato agli ottavi i valori che puo` assumere sono
2^(0),2^(1/8),...,2^(7/8). Ho precalcolato questi otto valori e li ho
messi in una funzione che ne restituisce il valore a seconda di rhof.
Trovi tutto piu` in dettaglio nella mia tesi
http://www.danielinux.net/projects/tesi.pdf
descrizione pagg. 52-54
e codice in appendice pagg. 89-90
HTH
--
Daniele Lacamera
root at danielinux.net
|