|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 693
|
[C] Banale moltiplicazione e divisione
Codice:
uint16_t
calcolak(uint16_t frequenza){
uint16_t k;
k=frequenza*16834/14343;
return k;
}
Dove sta il problema? P.S. uint16_t sta per una variabile int senza segno a 16bit (si trova in stdint.h)
__________________
Marco Ultima modifica di marcurs : 06-05-2010 alle 20:59. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
overflow.
Puoi passare a 32 bit internamente per il calcolo, per poi restituire di nuovo 16 bit.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 693
|
Quote:
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.. Codice:
uint16_t
calcolak(uint16_t freq){
uint32_t ff;
uint16_t k;
ff=freq;
k=(uint16_t)ff*16834/14343;
return k;
}
mah...
__________________
Marco |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Prova cosi'
Codice:
uint16_t
calcolak(uint16_t freq){
uint32_t ff;
uint16_t k;
ff=freq;
ff=(ff*16834)/14343;
k=(uint16_t)ff;
return k;
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 06-05-2010 alle 21:22. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12936
|
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). |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 693
|
Ok, ora funziona grazie!
Allora dov'è che sbagliavo? la parentesi di conversione agisce solo sul ff adiacente e non su tutta l'operazione?
__________________
Marco |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 693
|
Quote:
__________________
Marco |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12936
|
Quote:
Codice:
uint32_t calcolak(uint16_t frequenza)
{
return frequenza*16834/14343.0;
}
Codice:
uint32_t calcolak(uint16_t frequenza)
{
return frequenza*1.174;
}
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 693
|
La soluzione di gugoXX funziona perfettamente
Il risultato della funzione deve rimanere a 16 bit. Grazie comunque a tutti quanti!
__________________
Marco |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:07.



















