Re: Simulazione fisica C++: float o double ?

From: Stefano Gemma <stefano.niente.spam_at_millesimo.com>
Date: Fri, 10 Dec 2004 10:59:45 +0100

"Danguard" <danguard_robot_at_hotmail.com> ha scritto nel messaggio
news:MPG.1c22c35b26b9812c989a92_at_powernews.libero.it...
> 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?
[...]

Oil�... finalmente una domanda "di fisica" alla quale posso rispondere,
senza timore di essere contraddetto... di assembly decisamente ne capisco
;))))). Ma tu dirai: io parlo del C++, non dell'assembly. Come ben sai,
qualunque linguaggio tu usi, viene sempre compilato poi in assembly. Pi�
propriamente si dovrebbe parlare di linguaggio macchina, ma non siamo
pignoli, in questo contesto. Se, come suppongo, utilizzi un PC con CPU
Pentium, puoi usare tranquillamente i double. Il Pentium effettua i calcoli
in virgola mobile molto velocemente, indipendentemente dal fatto che si
usino i float od i double. Se consulti un manuale dell'assembly Pentium,
vedrai che ci sono istruzioni, come FMUL, che richiedono solo da 1 a 3
cicli, per essere eseguite.

Potrai notare un rallentamento, con i double invece dei float, in alcuni
casi, legati alla dimensione della cache. Avere dati pi� piccoli, li
potrebbe far stare completamente nella memoria cache della CPU, migliorando
cos� le prestazioni. Appena i dati (anche float) superano la dimensione
della cache, il vantaggio si perde totalmente.

Il mio consiglio, da programmatore, � quello di definire un tuo tipo di
dati:

typedef double numero;

da usare in tutti i punti del programma in cui scriveresti double o float.
In questo modo, devi solo modificare questa riga, per cambiare "al volo" la
precisione dei calcoli e fare esperimenti velocemente. Ad esempio:

numero CalcolaDistanza2d(numero xa,numero ya,numero xb,numero yb)
{
  numero deltax=xa-xb;
  numero deltay=ya-yb;
  return sqrt(deltax*deltax+deltay*deltay);
}

Un altro caso in cui usare float/double potrebbe fare la differenza �, come
nell'esempio, nella chiamata di funzioni matematiche che prevedono gi� un
tipo di dato particolare. La radice quadrata � implementata, dal
compilatore, per i vari tipi di dati numerici (float/double ecc.). Molto
probabilmente, l'implementazione non fa altro che chiamare l'equivalente
istruzione FSQRT del Pentium, lo stesso per seno, coseno ecc. Alcune
funzioni potrebbero per� essere risolte "da codice", invece che sfruttando
la CPU. Dipende dal compilatore, ma, in genere, ritengo che comunque siano
pi� efficienti con i double.

Ho recentemente verificato personalmente che non c'� una differenza
apprezzabile, addirittura nell'usare tipi interi o double, per il calcolo
matriciale. Questo � vero per il Pentium. Se usi altre CPU, non lo posso
affermare, non conoscendole (per altre CPU intendo quelle con architettura
diversa dal Pentium, non quelle compatibili con le CPU Intel).

Infine, se la simulazione � molto pesante, ti consiglio di analizzare il
codice assembly generato dal compilatore. In molti casi, lo si pu�
ulteriormente ottimizzare a mano, sia riscrivendolo direttamente in assembly
sia cambiando qualcosa nell'algoritmo in C++. In questo modo, ho
quadruplicato la velocit� di rendering di punti in una mia applicazione di
modellazione solida... quindi so cosa sto dicendo ;))))

Stefano
Received on Fri Dec 10 2004 - 10:59:45 CET

This archive was generated by hypermail 2.3.0 : Fri Nov 08 2024 - 05:10:22 CET