2 次方程式の実根を解く、非常に単純でありながら、完全に機能し、非常に役立つ 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
エンド ユーザーによる a、b、および c 値の入力に使用される NumericUpDown コントロールです。
OK、それで、さらに一歩進んで、虚数の値も解決することを望んでいました。条件が既に設定されていることを考えると、判別式が0
以下の場合にのみ虚数を考慮する必要があります0
。
しかし、これにアプローチする良い方法は思いつきません。複雑な解は、負の数の平方根を取得しようとすると発生し、i
s がいたるところに表示されます。 i = sqroot(-1)
とi^2 = -1
。
この問題に取り組む方法を知っている人はいますか、それとも時間の価値がないだけですか?
編集
もう少しグーグルで調べてみると、C# 4.0 (または .NET 4.0 のどちらかはわかりません) では組み込みの複素数サポートがあることがわかりましたSystem.Numerics.Complex
。私は今これをチェックしています。