J'utilise le livre "think java" et je suis bloqué sur l'exercice 7.6. Le but ici est d'écrire une fonction qui peut trouver . Il vous donne un conseils de couple:comment créer une fonction Exp (-x^2)?
Une façon d'évaluer est d'utiliser l'extension de la série infinie:
En d'autres termes, nous devons ajouter une série de termes où les ième terme est égal à
Voici le code que j'ai trouvé, mais il est horriblement faux (comparé à Math.exp) pour autre chose qu'une puissance de 1. Je ne comprends pas pourquoi, autant que je peux dire que le code est correct avec la formule du livre. Je ne suis pas sûr que ce soit plus une question mathématique ou quelque chose en rapport avec la taille d'un nombre double et int, mais j'essaie simplement de comprendre pourquoi cela ne fonctionne pas.
public static void main(String[] args) {
System.out.println("Find exp(-x^2)");
double x = inDouble("Enter x: ");
System.out.println("myexp(" + -x*x + ") = " + gauss(x, 20));
System.out.println("Math.exp(" + -x*x + ") = " + Math.exp(-x*x));
}
public static double gauss(double x, int n) {
x = -x*x;
System.out.println(x);
double exp = 1;
double prevnum = 1;
int prevdenom = 1;
int i = 1;
while (i < n) {
exp = exp + (prevnum*x)/(prevdenom*i);
prevnum = prevnum*x;
prevdenom = prevdenom*i;
i++;
}
return exp;
} // I can't figure out why this is so inacurate, as far as I can tell the math is accurate to what the book says the formula is
public static double inDouble(String string) {
Scanner in = new Scanner (System.in);
System.out.print(string);
return in.nextDouble();
}
Les entiers de Java n'ont que 32 bits, alors que votre 'prevdenom' veut atteindre 19 !, un nombre de 57 bits. Voyez ce qui arrive quand vous faites 'prevdenom' un double au lieu d'un int. –
Merci! Ça a bien marché! Je suppose que cela a du sens alors que ça ne fonctionnait pas comme un nombre entier parce que le nombre était trop grand. –
Etes-vous autorisé à utiliser machineEpsilon pour les doubles? –