Newsgroup: it.comp.java
Titolo: Ma è un problema dei double???

Salve,
ho provato a scrivere il seguente algoritmo:
int NAge=100;
double [] age=new double[NAge];
double Amin=Double.parseDouble("1E4");
double Amax=Double.parseDouble("1E7");
double MmA=Amax/Amin;
double DA;
for(int i=0; i<age.length; i++){
	DA=Math.pow(MmA, (1/(NAge-1)));
	age[i]=Amin*(Math.pow(DA,i));
	System.out.println(i+"  "+age[i]);
		}
solo che quando stampa compaiono tanti 10000.0 e solo l'ultimo è
1.0E301!!!! Se provo a farlo con una calcolatrice funziona. Col debug
ho provato a vedere che succede ed ho notato che 1/(Nage-1) risulta
0.0. Com'è possibile? Dovrebbe quantomeno essere 0.01!!! E' java che
ha bisogno del BigDecimal per questo genere di conti o che altro?

 ha bisogno del BigDecimal per questo genere di conti o che altro?
Attenta che porre questa domanda significa lapidazione pubblica senza
appello!
Si, è meglio usare BigDecimal, oppure lavorare in matematica "a virgola
fissa".
Ciao
gl

 fissa".
Grazie mi hai salvata dall'impiccagione!!!! Prometto che nn lo farò
più e che d'ora in poi userò sempre i BigDecimal!!! Ma se devo fare
il logaritmo come diavolo si fa??? Ho letto la documentazione ma nn mi
pare di aver trovato nulla.

Angela ha scritto:

Math.logxx ?

 ha bisogno del BigDecimal per questo genere di conti o che altro?
non hai bisogno necessariamente dei BigDecimal.
e' che se fai 1/(100-1) e' un calcolo tra interi, e il risultato e' un
intero ( = 0), che poi viene castato a double ( = 0.0).
prova a fare 1.0/(Nage-1.0) vedrai che il risultato cambia :)
Ciao Jack


Ho provato adesso e funziona. Grazie del suggerimento!!!  Quando posso
cerco di evitarli i Bigdecimal perchè la sintassi che usano mi fa
venire i nervi!!! Non potevano creare semplicemente un altro tipo dopo
i double? Mah!! 
Ciao ciao a tutti

 Math.logxx ?
Mi riferivo al fatto di dover usare il bigdecimal....

 writes:
A> Ho provato adesso e funziona. Grazie del suggerimento!!!  Quando posso
A> cerco di evitarli i Bigdecimal perchè la sintassi che usano mi fa
A> venire i nervi!!!
Neanche a  me piace,  peraltro non sarebbe  difficile fare  una classe
utility che implementi una notazione funzionale.
A>  Non potevano creare semplicemente un altro tipo
A> dopo i double? Mah!!
I double sono stati fatti perché se non li gestisce l'hardware ci sono
decenni (in informatica: ere geologiche) di routine efficienti per il
loro uso.
I BigDecimal, per loro natura, devono essere oggetti. E non sono tanti
i linguaggi ad offrire una cosa simile...
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software

 i linguaggi ad offrire una cosa simile...
di default no, ma c'e' sempre l'ottima libreria gmp per il C (e il
C++), e dovrebbe esserci anche un implementazione per il python se non
sbaglio.
Ciao Jack

> tanti i linguaggi ad offrire una cosa simile...
J> di default no, ma c'e' sempre l'ottima libreria gmp per il C (e il
J> C++), e dovrebbe esserci anche un implementazione per il python se
J> non sbaglio.
Non ho detto nessun'altro :) :).
(Ah, io stavo pensando ad un  linguaggio che queste cosine le offre da
 qualche decennio :) ... un po' prima del C)


  qualche decennio :) ... un po' prima del C)
/me pensa....
quale?
in ogni caso ste librerie a precisione arbitraria sono IMHO da usare
solo se non se ne puo' fare a meno, che non sono proprio cosi
efficienti.


E quindi qualora dovessi avere la massima precisione su un'espressione
logaritmica o che altro devo crearmi una classe a parte che mi faccia i
calcoli col bidecimal?Oppure ho capito male?

 calcoli col bidecimal?Oppure ho capito male?
Se le cifre significative di un double non ti bastano si.

 efficienti.
Pienamente d'accordo. 


 calcoli col bidecimal?Oppure ho capito male?
Come ha detto Jack, si, anche se la cosa non discende dalla mia frase.
Per  l'implementazione, dovrebbero  esserci  in letteratura  algoritmi
basati sulle approssimazioni polinomiali. Ma nuovamente. Se devi usare
una approssimazione polinomiale, la  tua precisione potrà anche essere
maggiore di quella di un double, ma non arbitraria. 
E un'altra  cosa. A naso  hai altri progetti  dopo la laurea.  Se vuoi
avere tempo per gli altri progetti  mi sa che ti conviene scrivere del
codice che usi bene i double, che con i BigDecimal, se ti devi mettere
a fare logaritmi mi sa che arriva prima la pensione che la laurea :)



Grazie per il suggerimento... imparare un nuovo linguaggio è sempre
un'esperienza, ma se prima arriva la laurea è meglio! Ciao ciao

 LISP, cui Java peraltro deve moltissimo.
ah ecco, e' un linguaggio che mi sono ripromesso di imparare. Ma non ne
ho avuto ancora l'occasione :(
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?