Re: Simulazione fisica C++: float o double ?
Danguard wrote:
> Volevo "giocherellare" un po' con le leggi della dinamica, e creare una
> piccola simulazione di moto in C++.
>
> Ho pero' dei dubbi su quale tipo scegliere per i numeri reali: qualcuno
> che ha esperienza a riguardo, potrebbe per piacere illuminarmi se sia
> meglio usare double o float?
>
> Io opterei per i double, che hanno precisione doppia rispetto ai float
> (anche se occupano il doppio della memoria)...pero' non so se la potenza
> dei double e' "sprecata"...oppure se invece, usando i float, otterei
> errori nella simulazione, dovuti a troncamenti e approssimazioni
> numeriche grossolane.
Premessa. Piu' che di float o double occorrerebbe parlare di
rappresentazioni a 32 o 64 bit. Considerando la situazione attuale,
usero' float e double come sinonimo (improprio) di 32 o 64 bit.
In genere l'integrazione delle equazioni del moto e' meno affetta da
problemi di precisione di altri campi computazionali. Questo vuol dire
che con i float si puo' lavorare. Pero' se siano o meno adeguati dipende
molto da cosa si deve fare. Con la rappresentazione standard (IEEE754)
per i numeri floating point si puo' contare su una precisione relativa
di dell'ordine di 10^-7 per i float e di 10^-16 per i double.
Questa precisione controlla l'errore di arrotondamento che si
ripercuote in vario modo sui risultati.
Nel caso dell'integrazione delle equazioni del moto c'e' sicuramente una
seconda sorgente di errore che e' l'errore di discretizzazione dell'
algoritmo di integrazione utilizzato. Qui ci sono varie possibilita'
"sul mercato" , ognuna con la sua dipendenza dell' errore dal time step
di integrazione.
In pratica, qualsiasi sia la scelta, ci saranno due tendenze
contrastanti: se riduci il time step riduci l' errore di
discretizzazione ma aumenti quello di arrotondamento e viceversa.
Un modo per decidere se l'integrazione e' corretta e' quello di
utilizzare la presenza di costanti del moto nel problema esatto per
verificare l' adeguatezza dei parametri numerici (e degli algoritmi)
prescelti.
Allora, se vuoi/hai bisogno di conservare le costanti del moto con alta
precisione sicuramente occorrera' usare double. Se invece non hai
esigenze estreme potresti anche usare i float.
Questo dal punto di vista di principio.
In pratica il raddoppiamento nell' occupazione di memoria dei double e'
difficilmente un serio problema (a meno che tu non voglia simulare
miliardi di particelle). Quanto ai tempi di esecuzione, dipende dalla
macchina su cui gira il programma, dal compilatore e dalla codifica. Non
ci sono regole precise e la versione double potrebbe essere piu' lenta,
equivalente o piu' veloce di quella float. Meglio fare dei test e, sulla
base dei risultati decidere cosa fare.
Il mio consiglio e' comunque di optare per la versione double a meno
che tu non abbia delle esigenze particolari.
Giorgio
Received on Fri Dec 10 2004 - 11:21:52 CET
This archive was generated by hypermail 2.3.0
: Thu Nov 21 2024 - 05:10:23 CET