View Full Version : [C] Banale moltiplicazione e divisione
uint16_t
calcolak(uint16_t frequenza){
uint16_t k;
k=frequenza*16834/14343;
return k;
}
Ho un "piccolo" problemino con questa funzione: In sostanza non capisco il perchè durante il debug vedo che la funzione non riesce a fare correttamente l'operazione, ma alla fine restituisce il valore k sballato (quasi sempre 2 o 0).
Dove sta il problema?
P.S. uint16_t sta per una variabile int senza segno a 16bit (si trova in stdint.h)
overflow.
Puoi passare a 32 bit internamente per il calcolo, per poi restituire di nuovo 16 bit.
overflow.
Puoi passare a 32 bit internamente per il calcolo, per poi restituire di nuovo 16 bit.
Intanto grazie...
Era quello che pensavo pure io, avevo provato a modificare il codice inserendo una nuova variabile a 32bit per fare i conti e successivamente effettuare la conversione a 16, ma il risultato non cambiava..
uint16_t
calcolak(uint16_t freq){
uint32_t ff;
uint16_t k;
ff=freq;
k=(uint16_t)ff*16834/14343;
return k;
}
in questo caso il k mi viene 3 (con un k maggiore di 3000)
mah...
Prova cosi'
uint16_t
calcolak(uint16_t freq){
uint32_t ff;
uint16_t k;
ff=freq;
ff=(ff*16834)/14343;
k=(uint16_t)ff;
return k;
}
Scusa ma il tuo k deve essere intero? Ma soprattutto, come fai a sapere che il risultato di quell'operazione venga esattamente intero?
La divisione tra interi ti restituisce solo il quoziente.
Poi 16834/14343 potresti risolverla come una costante il cui valore è circa 1,174 (approssimato).
Ok, ora funziona grazie!
Allora dov'è che sbagliavo? la parentesi di conversione agisce solo sul ff adiacente e non su tutta l'operazione?
Scusa ma il tuo k deve essere intero? Ma soprattutto, come fai a sapere che il risultato di quell'operazione venga esattamente intero?
La divisione tra interi ti restituisce solo il quoziente.
Poi 16834/14343 potresti risolverla come una costante il cui valore è circa 1,174 (approssimato).
Il risultato dell'operazione non verrà mai intero, lo so, ma mi interessa un'approssimazione e il troncamento all'intero mi dovrebbe bastare.
Il risultato dell'operazione non verrà mai intero, lo so, ma mi interessa un'approssimazione e il troncamento all'intero mi dovrebbe bastare.
Tu prova così:
uint32_t calcolak(uint16_t frequenza)
{
return frequenza*16834/14343.0;
}
Oppure come ti dicevo prima:
uint32_t calcolak(uint16_t frequenza)
{
return frequenza*1.174;
}
La soluzione di gugoXX funziona perfettamente
Il risultato della funzione deve rimanere a 16 bit.
Grazie comunque a tutti quanti!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.