Numeri grandi dimensioni/piccolissimi

di il
19 risposte

Numeri grandi dimensioni/piccolissimi

Salve a tutti ! Girando in rete non sono riuscito a trovare una risposta ai miei dubbi...

Ho bisogno di definire una costante tramite delle operazioni algebriche, tuttavia il mio risultato risulta troncato.
cerco di spiegarmi meglio

#define Fosc1 8000000  
#define prescaler 256
#define tempo_ms  1/Fosc1*4*prescaler*255*1000
#define cicli 120/tempo_ms

......
int a=cicli;

Il problema è che quando vado a sostituire ' tempo_ms' il mio risultato risulta pari a zero.
Il 'precompilatore ' (se così si può chiamare ) va a troncarmi il risultato.
Detto in altre parole ottengo a=0.
Purtroppo non posso andare a definire variabili float o cose del genere in quanto la leggerezza del programma è essenziale (deve girare su un microcontrollore).

Ringrazio in anticipo tutti quelli che vorranno darmi una mano.

19 Risposte

  • Re: Numeri grandi dimensioni/piccolissimi

    Scusa ma fino a prova contraria, se usi solo gli interi, 10 diviso 9 e' uguale a 0!

    Quindi come speri di risolvere il problema se vuoi utilizzare solo gli interi?

    C'e' una soluzione, ovviamente: usi i numeri razionali, oppure scali tutti i valori in modo opportuno.

    Ma sono approcci abbastanza sofisticati e bisogna avere chiaro quello che si sta' facendo, oltre a conoscere esattamente quali sono le regole della propagaziond degli errori ed il loro effetto sui risultati finali

    Oltre al fatto che questi approcci richiedono piu' operazioni (continue moltiplicazioni e divisioni o il calcolo del gcd) o la continua allocazione/deallocazioni di strutture dati (numeri razionali).

    Quindi:

    1) il microcontrollore supporta i float?
    2) quante volte al secondo vengono eseguiti calcoli che coinvolgono i float? 10? 100? 1000.000?
    3) se il mc supporta i float ma tu non li usi, ma usi un'implementazione 'banale' (nel senso, l'implementazione classica, che faresti probabilmente con i float) del tuo algoritmo, sei sicuro che il tuo algoritmo risulta piu' efficiente?
    4) sei sicuro che esiste una variante del tuo algoritmo, opportunamente progettato per usare solo i numeri interi, funzionante?

    Moooolto spesso, ma veramente moooolto, le inefficienze non sono dove uno crede che siano.
    E quasi mai si risolvono con considerazioni del tipo: uso gli interi al posto dei float
  • Re: Numeri grandi dimensioni/piccolissimi

    Ciao ! Purtroppo non mi occupo di programmazione pura e quindi ho parecchie lacune... il fatto che il mio risultato venga troncato a un intero quando lo metto dentro una variabile di tipo int mi sta bene, anzi è proprio quello che voglio. Il problema è che il mio risultato troncato dovrebbe essere 32, invece viene troncato già quando faccio define tempo_ms e quindi finisco col dividere per 0....


    volevo sapere se era possibile estendere il numero di bit utilizzati dal "precompilatore" per fare i calcoli...
  • Re: Numeri grandi dimensioni/piccolissimi

    Il problema dello scalare i numeri è che Fosc ha un range piuttosto ampio di variazione (a seconda dei casi). Io avrei bisogno che questi calcoli venissero eseguiti già in fase di compilazione.
  • Re: Numeri grandi dimensioni/piccolissimi

    Ho aggiuto ulteriori considerazioni...

    Allora ti do un'altra dritta: se esegui le operazioni da sinistra a destra, una alla volta, quando conviene fare la divisione?

    1) a/b*c
    2) a*c/b

    ?
  • Re: Numeri grandi dimensioni/piccolissimi

    Mi convine farla alla fine Tuttavia in questo caso se la faccio alla fine rischio di avere numeri troppo grandi (superati i 16 bit di estensione avrei il problema opposto). Ho provato a cambiare l'ordine in modo da far funzionare le cose, ma quando vado a dare altri valori a Fosc mi ritrovo al punto di partenza.
  • Re: Numeri grandi dimensioni/piccolissimi

    Sei sicuro che il precompilatore non supporti i 32bit?
  • Re: Numeri grandi dimensioni/piccolissimi

    Se e' solo un problema di questo tipo, puoi scrivere l'espressione costante in modo che i calcoli vengano fatti usando i long e poi fai il cast a int
  • Re: Numeri grandi dimensioni/piccolissimi

    Purtroppo penso arrivi solo a 16 Se fossero stati 32 probabilmente non avrei avuto problemi... non esistono direttive per dire al precompilatore di lavorare con più bit? (perdona il mio lessico poco appropriato). Dopotutto il precompilatore potrebbe prendersi tutto il tempo che vuole per fare i calcoli...a differenza del programma lui non deve lavorare in real time.
  • Re: Numeri grandi dimensioni/piccolissimi

    In pratica le mie costanti hanno una definizione di soli 16 bit....non posso dichiarare un float(o una cosa del genere) che però venga eseguito solo dal precompilatore ? Purtroppo se inserisco una variabile float direttamente nel programma vado a occupare quasi il 25% della ram.
  • Re: Numeri grandi dimensioni/piccolissimi

    Ad esempio:
    #define Fosc1 8000000L
    #define prescaler 256
    #define tempo_ms  ((int)(4L*prescaler*255*1000/Fosc1))
    #define cicli 120/tempo_ms
    e se vuoi usare i float in fase di precompilazione:
    #define Fosc1 8000000.0
    #define prescaler 256
    #define tempo_ms  ((int)(0.0+4*prescaler*255*1000/Fosc1))
    #define cicli (120/tempo_ms)
    Ti ricordo che un intero a 16 bit puo' assumere i valori nei range [-32768..32767] oppure [0..65535] (se unsigned)

    Gia' Fosc1 non e' rappresentabile, e me che meno 4*256*255*1000 (=261120000)

    Visto che "4*prescaler*255*1000/Fosc1" vale circa 32, perche' non risolvi l'espressoine direttamente a mano?

    Al limite, esiste una libreria che implementa i float a 16 bit:

    Quindi la domanda sorge spontanea: sei sicuro dell'approccio che stai seguendo?

    Se non sei esperto di programmazione e giochi con microcontrollori, e se e' per lavoro, e' meglio che ti fai consigliare da qualcuno con maggiori competenze: rischi di fare un disastro (volevo dire casino, ma non e' elegante ).

    Se e' per divertimento, allora preparati a comportamenti assolutamente imprevedibili

    Concettualmente: ti devi assicurare che ogni operazione (somma, sottrazione, moltiplicazione, divisione, incrementi, decrementi, ...) non generi overflow!
    Gia' parti in modo sbagliato con le definizioni delle macro Fosc1 e tempo_ms.
  • Re: Numeri grandi dimensioni/piccolissimi

    I microcontrollori sono una passione .... come ho già detto ho ben chiare le varie dimensioni in fase di esecuzione del programma, se no con i microcontrollori farei ben poco. Questi calcoli dovrebbero essere eseguiti in fase di precompilazione e quindi è solo un problema di direttive da impartire al precompilatore. risolverla a mano è la soluzione che sto usando adesso, ma non è molto pratica... sopratutto quando uno va a ripescare il programma dopo mesi... se poi non c 'è una soluzione continuerò a usare la calcolatrice.
  • Re: Numeri grandi dimensioni/piccolissimi

    Quali micro usi?
  • Re: Numeri grandi dimensioni/piccolissimi

    Per ora dei pic16 a 8 bit... ho diversi modelli ma sto aspettando che mi arrivino dei pic 18 che ho ordinato....
  • Re: Numeri grandi dimensioni/piccolissimi

    Nel caso in questione se assumi

    #define Fosc1 8

    puoi scrivere, mantenendo una buona precisione, semplicemente

    #define tempo_ms prescaler/Fosc1
Devi accedere o registrarti per scrivere nel forum
19 risposte