|
|
|
![]() |
|
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 19: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 20:22. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12822
|
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: 12822
|
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: 00:28.