Newsgroup: it.comp.lang.c++
Titolo: calcolo numerico

quale č il compilatore free migliore per il calcolo numerico secondo voi?
a me interessano precisione e, quindi, aderenza allo standard ansi..
secondo il mio niubbistico parere il migliore per ora si č rivelato il
borland 5.51 su piattaforma win32 una spanna sopra il gcc su linux.

 borland 5.51 su piattaforma win32 una spanna sopra il gcc su linux.
Ciao, purtroppo non ti so rispondere però forse potresti spiegarmi una
cosa...
Programmavo anni fa in C su Workstation dotate del proc. motorola 68020 che
andavano con Unix e ora invece scrivo in C++ per Windows (e/o Linux) su
architetture i386, uso i compilatori Microsoft/Borland/Dev-C++, ma non
riesco a capire...
Usando float, ottenevo risultati di precisione accettabili sulle
workstation/680x0, mentre ora se non uso i double i programmi che faccio
commettono errori di arrotondamento clamorosi.
Eppure mi sembra che i compilatori che uso siano comunque di buona qualità
(il Borland mi piace molto, anche il Dev... con M$ non vado molto
d'accordo). Ma allora da cosa dipende la precisione, solo dal compilatore o
c'è dell'altro (S.O., CPU)?
Chi lo sa soddisfi questa mia curiosità (anche se forse è OT, mi spiace).

 Chi lo sa soddisfi questa mia curiosità (anche se forse è OT, mi spiace).
Ecco quello che il corso di metodi numerici mi ha insegnato:
La rappresentazioni dei numeri reali avviene attraverso un processo di "discretizzazione". In pratica questo significa
che non possiamo rappresentare qualsiasi numero su una macchina data l'impossibilità di una rappresentazione infinita.
Questo significa che a seconda del modello di rappresentazione possiamo avere a disposizione un certo numero di reali,
con dei "buchi" tra un numero ed un altro che cresce al crescere dell'ordine di grandezza. Ora, secondo lo standard IEEE
754 che seguono le attuali architettura PC, un double è formato da 64 bit, dei quali uno per il segno, 52 bit di
mantissa e 11 di esponente. Questo significa una precisione di circa 10 ^ -15 e cioè la possibilità di avere 15 cifre
significative esatte. Sfortunatamente neanche l'ultima è sempre esatta in quanto avviene il cosidetto errore di
round-off o di arrotondamento. Questo perchè nell'eseguire i calcoli c'è la possibilità che alcuni risultati vengano
arrotondati per difetto o per eccesso fornendo una perturbazione sull'ultima cifra. Se usi invece i float avrai una
precisione di 10 ^ -7.
Per farti capire meglio la faccenda riprendo la questione dei buchi. Cercando di ricordare le proprietà di densità
dell'insieme dei numeri reali, possiamo affermare che presi due reali anche "molto vicini" (scusa il linguaggio poco
formale ma non voglio certo entrare nei dettagli matematici) esistono infiniti numeri reali compresi tra di loro. Questa
densità non è rappresentabile su una macchina, perciò dobbiamo accontentarci di avere degli spazi vuoti. Questi spazi
vuoti diventano via via più grandi man mano che l'ordine di grandezza dei numeri considerati aumenta, questo per via del
fatto che la rappresentazione è in formato esponenziale, quindi l'incremento non è lineare bensì esponenziale. Ora se
durante un calcolo abbiamo come risultato un numero presente in uno dei buchi, avviene l'arrotondamento per difetto o
pre eccesso al numero floating-point più "vicino". Se i calcoli sono tanti, per ogni calcolo c'è la probabilità
(peraltro molto alta) che si accumuli un ulteriore errore di round-off. Minore è la precisione, maggiore è la
probabilità errori nei calcoli.
Prova a fare un esempio con
long l = 2000000001;
float f = static_cast<float>(l);
se stampi f vedrai che vale 2000000000 invece che 2000000001.
Concludendo, io non conosco le architetture motorola 680x0 ma ne deduco che la loro precisione era maggiore di quella
ottenibile con piattaforme intel, d'altronde al corso ho sentito di un cray che aveva la precisione di 10 ^ -2048.
Comunque molto dipende anche dalla stabilità dei metodi di calcolo. come ad esempio
int i = 2000000000 + 1000000000 - 1000000000;
se immaginiamo int a 32 bit il primo temporaneo (20000000000 + 1000000000 ) sfora il range degli interi e il secondo lo
riporta all'interno (un'ottimizzatore elimina la differenza, ma questo è un caso particolare). La somma avviene lo
stesso ma probabilmente l'algoritmo di somma provvederà prima a fare la differenza e poi la somma. E' questo che si
intende per stabilità. Comunque approfondire è impossibile con una mail, mi dilungherei troppo.
Spero di essere stato abbastanza chiaro!
Ciao