2009-11-08 1 views
3

Я делаю домашнее задание проект, который требует этого:Math.sqrt против Ньютона-Рафсона метод нахождения корней в C#

Ниже вы найдете код, который я написал, чтобы вычислить квадратный корень из числа используя метод Ньютона-Рафсона. Включите его в свой проект. Для этого проекта ваша работа будет заключаться в том, чтобы написать тестовый жгут, который проверяет код, который я написал. Внимательно прочитайте пролог метода, чтобы понять, как должна работать эта функция. Ваш тестовый жгут будет содержать петлю, которая:

  1. Запрашивает пользователя ввести тестовое значение.
  2. Получает ввод пользователя. Если введен нуль, ваша программа распечатает отчет и завершит работу.
  3. Вызывает метод Sqrt, предоставляемый в этом проекте, и сохраняет возвращаемое значение в двойной переменной.
  4. Вызывает метод Sqrt, который встроен в класс Math и сохраняет возвращаемое значение во второй двойной переменной.
  5. Сравните эти два значения, чтобы убедиться, что они равны.
  6. Когда пользователь указывает, что они сделаны (путем ввода нуля) отобразить отчет, который показывает эту информацию: * Сколько испытаний случаев вы казнены * Сколько прошло * Сколько удалось

Так Я сделал все это без каких-либо проблем примерно через 15 минут, однако для дополнительного кредита он просит нас найти, что не так с его методом Sqrt, и исправить его, чтобы его возвращаемое значение равнялось возвращаемому Math.Sqrt значению структуры .net. Я не могу найти проблему в его методе, и я хочу ее найти, поэтому мне было интересно, может ли кто-нибудь указать мне в правильном направлении, в чем проблема с его методом Sqrt? Благодарю.

Вот мой полный код:

// 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; 
} 

}

ответ

5

Попробуйте установить const double EPS = 0.000000001; - это ваш эпсилон. Именно это определяет точность вашего ответа.

+0

ahh спасибо! Это имеет смысл! Я не могу поверить, что раньше об этом не думал. Благодаря тонну. – Alex

+0

Извините, 0.000000001 - это случайное значение, которое я выбрал. Как я уже сказал, это определитель того, насколько точны ваши квадратные корневые аппроксимации, поэтому ваш квадратный корень будет точным до +/- EPS. – Rooke

+0

Хорошо, это имеет смысл, спасибо еще раз. – Alex

3

Math.sqrt возвращает NaN, если аргумент отрицателен. Кроме того, я думаю, что EPS будет намного меньше.

+0

Кроме того, спасибо, так как это было действительно то, что мне нужно было сделать – Alex

+0

Тогда, пожалуйста, подтвердите свой ответ. – Artelius

Смежные вопросы