L'esercizio diceva esattamente di approssimare il valore di e^x tramite la Serie di Taylor (o come cappero si chiama xD), finchè l'ennesimo valore della detta serie non assumeva un valore molto piccolo (io ad esempio ho scritto 10E-10, ma potrebbe anche essere stato 10E-9) e di confrontare il valore ottenuto con l'e^x calcolato usando il valore del numero di Nepero restituito dall'apposita costante matematica contenuta nella libreria Math.
Il codice per la risoluzione del problema è il seguente:
(ovviamente mancano tutta una serie di controlli per x negativo, zero, e così via, però la base è questa)
import javax.swing.JOptionPane;
public class SerieDiTaylor {
public static void main(String []args) {
int n = 0, b = 0;
double x = 0, passo = 0, approssimazione = 0;
long fattoriale;
try {
x = Double.parseDouble(JOptionPane.showInputDialog("Inserisci il numero \"x\" per cui approssimare la funzione Math.pow(Math.E,x);:"));
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null,"Numero inserito non valido, l'esecuzione del programma verrà terminata.");
System.exit(0);
}
do {
fattoriale = 1;
b = n;
while (b > 0) {
fattoriale *= b;
b--;
}
passo = Math.pow(x,n) / fattoriale;
approssimazione += passo;
n++;
} while (passo > 10E-10);
JOptionPane.showMessageDialog(null,"L'approssimazione della funzione Math.pow(Math.E,x);, per x=" + x + " attraverso la Serie di Taylor è risultata essere:\n" + approssimazione + "\nmentre la funzione vera e propria ha restituito:\n" + Math.pow(Math.E,x) + "\nl'errore d'approssimazione è stato pertanto di:\n" + Math.abs(Math.pow(Math.E,x) - approssimazione));
System.exit(0);
}
}
l'unico neo riscontrato è il non funzionamento per alcuni valori numerici, che tendono a far sballare qualche variabile facendo sbagliare il calcolo all'intero programma.
Infatti (ad esempio) per x=100 la funzione d'approssimazione restituirà -2.302.............E23 e il numero negativo probabilmente (anche se non ho fatto le dovute prove) proviene dal fattoriale che (long) è soggetto al complemento a due e quindi ad arrivare ad assumere valori negativi.
Saluti,
Danilo.
EDIT:
Infatti, confermo; questo è l'andamento del fattoriale:
1
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
-4249290049419214848
che ovviamente farà cambiare segno a tutta la sommatoria.
EDIT2:
e anche mettendolo double, sforiamo di brutto il limite consentito, raggiungendo il caro "Infinity".
Saluti.