Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-05-2010, 20:49   #1
marcurs
Senior Member
 
L'Avatar di marcurs
 
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;
}
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)
__________________
Marco

Ultima modifica di marcurs : 06-05-2010 alle 20:59.
marcurs è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 21:10   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 21:18   #3
marcurs
Senior Member
 
L'Avatar di marcurs
 
Iscritto dal: Aug 2004
Messaggi: 693
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
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..
Codice:
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...
__________________
Marco
marcurs è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 21:19   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 21:21   #5
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
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).
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 21:33   #6
marcurs
Senior Member
 
L'Avatar di marcurs
 
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
marcurs è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 21:34   #7
marcurs
Senior Member
 
L'Avatar di marcurs
 
Iscritto dal: Aug 2004
Messaggi: 693
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
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.
__________________
Marco
marcurs è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 21:41   #8
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12936
Quote:
Originariamente inviato da marcurs Guarda i messaggi
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ì:

Codice:
uint32_t calcolak(uint16_t frequenza)
{
    return frequenza*16834/14343.0;
}
Oppure come ti dicevo prima:

Codice:
uint32_t calcolak(uint16_t frequenza)
{
    return frequenza*1.174;
}
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 22:26   #9
marcurs
Senior Member
 
L'Avatar di marcurs
 
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
marcurs è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
SpaceX realizzerà uno smartphone ...
Fire TV Omni QLED, Serie 2 e Serie 4: le...
Con l'Event Horizon Telescope si sta stu...
Milano Cortina 2026, dietro le quinte de...
IA e automazione: le armi per industrial...
SpaceX sta per rimuovere il braccio di a...
Sony a ISE 2026: display, soluzioni imme...
Sony punta sull'IA: brevettati i podcast...
Logitech G Astro A50, le cuffie gaming d...
Lenovo a ISE 2026: smart collaboration, ...
GeForce RTX 5000 SUPER cancellate e RTX ...
Substack conferma violazione: esposti da...
L'IA costa caro. Oracle punta a raccogli...
OpenAI lancia Frontier: il cervello cent...
Questo robot aspirapolvere lava sempre c...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:46.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v