3 Stimmen

math.sqrt vs. Newton-Raphson-Methode zum Finden von Wurzeln in c#

Ich mache gerade eine Hausaufgabe, die dies erfordert:

Im Folgenden finden Sie den Code, den ich geschrieben habe, um die Quadratwurzel einer Zahl mit der Newton-Raphson-Methode zu berechnen. Fügen Sie ihn in Ihr Projekt ein. Ihre Aufgabe in diesem Projekt wird es sein, ein Testprogramm zu schreiben, das den von mir geschriebenen Code testet. Lesen Sie den Prolog der Methode sorgfältig durch, um zu verstehen, wie die Funktion funktionieren soll. Ihr Test-Kabelbaum soll eine Schleife enthalten, die:

  1. Fordert den Benutzer auf, einen Testwert einzugeben.
  2. Ruft die Eingaben des Benutzers ab. Wenn eine Null eingegeben wird, druckt Ihr Programm einen Bericht aus und beendet sich.
  3. Ruft die in diesem Projekt bereitgestellte Methode Sqrt auf und speichert den Rückgabewert in einer Double-Variablen.
  4. Ruft die Methode Sqrt auf, die in die Klasse Math integriert ist, und speichert den Rückgabewert in einer zweiten Double-Variablen.
  5. Vergleichen Sie diese beiden Werte, um festzustellen, ob sie gleich sind.
  6. Wenn der Benutzer angibt, dass er fertig ist (indem er eine Null eingibt), wird ein Bericht angezeigt, der folgende Informationen enthält: * Wie viele Testfälle Sie ausgeführt haben [ ] * Wie viele sind fehlgeschlagen

Ich habe das alles also ohne Probleme in etwa 15 Minuten geschafft, aber für die Extrapunkte sollen wir herausfinden, was mit seiner Sqrt-Methode falsch ist und sie so korrigieren, dass ihr Rückgabewert dem Math.Sqrt-Rückgabewert des .net Frameworks entspricht. Ich kann das Problem in seiner Methode nicht finden, und ich möchte es finden, also frage ich mich, ob mir jemand einen Hinweis geben kann, was das Problem mit seiner Sqrt-Methode ist? Danke!

Hier ist mein vollständiger Code:

// declare variables
    double userInput = 0.0;
    double debrySqrtReturnValue = 0.0;
    double dotNetSqrtReturnValue = 0.0;
    int testCasesExecuted = 0;
    int testsPassed = 0;
    int testsFailed = 0;
    bool isEqual = false;

    do
    {
        // Prompt the user to enter in a test value
        Console.Write("Please enter a positive integer value: ");
        userInput = double.Parse(Console.ReadLine());

        if (userInput != 0)
        {
            debrySqrtReturnValue = Sqrt(userInput);
            dotNetSqrtReturnValue = Math.Sqrt(userInput);

            Console.WriteLine("The square root of {0} is: {1}", userInput, debrySqrtReturnValue);
            Console.WriteLine("The real square root of {0} is: {1}\n", userInput, dotNetSqrtReturnValue);

            if (debrySqrtReturnValue == dotNetSqrtReturnValue)
                isEqual = true;
            else
                isEqual = false;

            if (isEqual)
                testsPassed++;
            else
                testsFailed++;

            testCasesExecuted++;
        }
    } while (userInput != 0);

    Console.WriteLine("\n\n--------------------------------Report---------------------------------");
    Console.WriteLine("test cases excecuted: {0}", testCasesExecuted);
    Console.WriteLine("tests passed: {0}", testsPassed);
    Console.WriteLine("tests failed: {0}", testsFailed); 

    Console.ReadLine();
}

// The Sqrt method
// Purpose: to compute the square root of a number
// Parameters: a positive, non-zero integer
// returns: a double, which is the square root of the number
// ---------------------------------------------------------
static double Sqrt(double number)
{
    // constants to use in the calculation
    const int FIRST_APPROX = 2;
    const double EPS = 0.001;

    // a local variable
    double xN = 0;

    // pick 2 as first approximation
    double xNPlus1 = FIRST_APPROX;
    do
    {
        xN = xNPlus1; 
        xNPlus1 = xN - ((xN * xN - number) / (FIRST_APPROX * xN));

    } while (Math.Abs(xNPlus1 - xN) > EPS);
    return xN;
}

}

5voto

Rooke Punkte 1985

Versuchen Sie die Einstellung const double EPS = 0.000000001; - das ist dein Epsilon. Das bestimmt die Genauigkeit Ihrer Antwort.

3voto

Artelius Punkte 46771

Math.sqrt gibt NaN zurück, wenn das Argument negativ ist. Außerdem denke ich, dass EPS viel kleiner sein würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X