Ich versuche, eine Methode, die eine Annäherung an den natürlichen Logarithmus einer Variablen mit einer Taylor-Serie findet.Wie Logs/Umgang mit NaN's
Ich kenne die Math.log(a)
Methode und möchte sie hier nicht verwenden.
Das Problem ist, dass für Zahlen größer als 2 das zurückgegebene Ergebnis NaN
ist. Dies trifft nur zu, wenn die äußere Schleife for
so eingestellt ist, dass sie viele Male ausgeführt wird. Zum Beispiel gibt n < 10
ein Ergebnis, aber kein genaues Ergebnis. Je mehr jedoch die äußere for
Schleife ausgeführt wird, desto genauer wird das Ergebnis sein.
Taylor-Reihe für ln(x)
zu finden (im Wesentlichen, was ich versuche in Java-Code zu schreiben)
public static double nat_log(double x) {
double result = 0.0;
for (int n = 1; n < 10000; n++) {
double a = x - 1;
int b = 1;
for (int j = 1; j < n; j++) {
a *= (x - 1);
b *= -1;
}
result += b * a/n;
}
return result;
}
Meine Logik ist, dass irgendwann a
zu groß wird und wird als NaN
lesen, so den Rest des Codes wegwerfen. Also habe ich versucht eine Version mit einer while
Schleife und die Double.isNaN(double)
Methode zu überprüfen, ob a
jemals NaN
wurde. Das Ergebnis war eine Endlosschleife.
public static double nat_log(double x) {
double result = 0.0;
double a = x - 1;
int count = 1;
while (Double.isNaN(a) == false) {
a = x - 1;
int b = -1;
for (int j = 0; j < count; j++) {
a *= (x - 1);
b *= -1;
}
result += b * (a/count);
count++;
}
}
An diesem Punkt bin ich wirklich stecken und nicht genau, wo das Problem liegt, vielleicht etwas ohne die richtigen Werkzeuge Ich versuche nur zu tun.
ich nicht klar bin, ob Sie bereits wusste, dass dies oder nicht, aber diese Serie Taylor nicht konvergieren, wenn x> 2. https Siehe: // en. wikipedia.org/wiki/Taylor_series#List_of_Maclaurin_series_of_some_common_functions – ajb
Außerdem glaube ich nicht, dass du wirklich 'NaN' bekommst. Wenn Sie die Zahlen multiplizieren und sie zu groß werden, erhalten Sie möglicherweise "unendlich", was sich von "NaN" unterscheidet. Das würde die Endlosschleife erklären. Vielleicht möchten Sie Ihren zweiten Algorithmus ändern, um 'Double.isInfinite()' zu überprüfen, um dies selbst zu überprüfen. – ajb
Wenn Sie wirklich einen Algorithmus wollen, der für x> 2 funktioniert, sollten Sie ihn mit _e_ teilen, bis er <2 wird, und die Anzahl der Teilungen zählen. Wenn die Anzahl "N" ist, dann addiere "N" zum Ergebnis der Taylor-Reihe. – ajb