Я создал чрезвычайно простое, но полностью функциональное и весьма полезное приложение WinForms C #, которое находит действительные корни квадратного уравнения.
Вот моя текущая логика программирования:
string noDivideByZero = "Enter an a value that isn't 0";
txtSolution1.Text = noDivideByZero;
txtSolution2.Text = noDivideByZero;
decimal aValue = nmcA.Value;
decimal bValue = nmcB.Value;
decimal cValue = nmcC.Value;
decimal solution1, solution2;
string solution1String, solution2String;
//Quadratic Formula: x = (-b +- sqrt(b^2 - 4ac)) / 2a
//Calculate discriminant
decimal insideSquareRoot = (bValue * bValue) - 4 * aValue * cValue;
if (insideSquareRoot < 0)
{
//No real solution
solution1String = "No real solutions!";
solution2String = "No real solutions!";
txtSolution1.Text = solution1String;
txtSolution2.Text = solution2String;
}
else if (insideSquareRoot == 0)
{
//One real solution
decimal sqrtOneSolution = (decimal)Math.Sqrt((double)insideSquareRoot);
solution1 = (-bValue + sqrtOneSolution) / (2 * aValue);
solution2String = "No real solution!";
txtSolution1.Text = solution1.ToString();
txtSolution2.Text = solution2String;
}
else if (insideSquareRoot > 0)
{
//Two real solutions
decimal sqrtTwoSolutions = (decimal)Math.Sqrt((double)insideSquareRoot);
solution1 = (-bValue + sqrtTwoSolutions) / (2 * aValue);
solution2 = (-bValue - sqrtTwoSolutions) / (2 * aValue);
txtSolution1.Text = solution1.ToString();
txtSolution2.Text = solution2.ToString();
}
txtSolution1
и txtSolution2
- это текстовые поля, которые не могут принимать ввод, но выводят результаты вычислений.
nmcA
, nmcB
и nmcC
- это элементы управления NumericUpDown, которые используются для ввода значений a, b и c конечным пользователем.
Итак, я надеялся пойти дальше и, возможно, решить и для мнимых значений. Учитывая, что у меня уже настроены условные выражения, мне нужно будет учитывать мнимые значения только тогда, когда дискриминант равен 0
или меньше 0
.
Однако я не могу придумать хороший способ подойти к этому. Сложные решения возникают, когда кто-то пытается извлечь квадратный корень из отрицательного числа, что приводит к появлению i
s повсюду. i = sqroot(-1)
и i^2 = -1
.
Кто-нибудь знает, как подойти к этой проблеме, или это просто не стоит времени?
ИЗМЕНИТЬ
Немного погуглив, я обнаружил, что это возможно с C # 4.0 (или .NET 4.0, я не уверен, какой) есть встроенная поддержка комплексных чисел в System.Numerics.Complex
. Я проверяю это сейчас.
solution2String
должен быть повторением корня, а не Нет реальное решение. - person Ben Voigt   schedule 09.11.2010multiplicity of 0
или что-то в этом роде. Спасибо что подметил это! Кроме того, десятичная дробь дает более высокую точность, не так ли? - person Qcom   schedule 09.11.2010double
, а потом конвертируете вdecimal
. Так что нет, вы не получаете более высокой точности, вы просто замедляете работу. - person Ben Voigt   schedule 09.11.2010