2016-04-13 36 views
2

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) Taylor Series for finding <code>ln(x)</code>

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.

+0

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

+2

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

+1

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

Antwort

-1

Ihre while-Schleife wird eine infinate Schleife bei Zählerüberlauf

+0

Das 'while' sieht überhaupt nicht nach 'count', also ergibt diese Antwort keinen Sinn. – ajb

+0

@ajb ja ich weiß, aber es könnte ein nie ein NAN machen –