Я делаю домашнее задание проект, который требует этого:Math.sqrt против Ньютона-Рафсона метод нахождения корней в C#
Ниже вы найдете код, который я написал, чтобы вычислить квадратный корень из числа используя метод Ньютона-Рафсона. Включите его в свой проект. Для этого проекта ваша работа будет заключаться в том, чтобы написать тестовый жгут, который проверяет код, который я написал. Внимательно прочитайте пролог метода, чтобы понять, как должна работать эта функция. Ваш тестовый жгут будет содержать петлю, которая:
- Запрашивает пользователя ввести тестовое значение.
- Получает ввод пользователя. Если введен нуль, ваша программа распечатает отчет и завершит работу.
- Вызывает метод Sqrt, предоставляемый в этом проекте, и сохраняет возвращаемое значение в двойной переменной.
- Вызывает метод Sqrt, который встроен в класс Math и сохраняет возвращаемое значение во второй двойной переменной.
- Сравните эти два значения, чтобы убедиться, что они равны.
- Когда пользователь указывает, что они сделаны (путем ввода нуля) отобразить отчет, который показывает эту информацию: * Сколько испытаний случаев вы казнены * Сколько прошло * Сколько удалось
Так Я сделал все это без каких-либо проблем примерно через 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;
}
}
ahh спасибо! Это имеет смысл! Я не могу поверить, что раньше об этом не думал. Благодаря тонну. – Alex
Извините, 0.000000001 - это случайное значение, которое я выбрал. Как я уже сказал, это определитель того, насколько точны ваши квадратные корневые аппроксимации, поэтому ваш квадратный корень будет точным до +/- EPS. – Rooke
Хорошо, это имеет смысл, спасибо еще раз. – Alex