Мнимые числа в C#

Я пытаюсь сделать простую консольную программу, которая может решать квадратные уравнения. Я до сих пор не понял, как вычислить ответы, если дискриминант — отрицательное число, поэтому я просто отобразил сообщение в качестве заполнителя. Так может кто-нибудь объяснить, как это сделать? Я опубликую всю программу для любых предложений. Спасибо.

Правильно работающий код (спасибо, Гюнтер Фокс):

if(discriminant < 0)
{
    double x1 = -b/(2*a);
    discriminant = -discriminant ;
    double x2 = Math.Sqrt(discriminant)/(2*a);
    double x3 = -Math.Sqrt(discriminant)/(2*a);
    Console.WriteLine(x1.ToString() + " + " + x2.ToString() + " * i ");
    Console.WriteLine(x1.ToString() + " + " + x3.ToString() + " * i ");

    Console.ReadLine();
}

Старый код:

class Program
{
    static void Main(string[] args)
    {
        int choice;
        double ans1;
        double ans2;

        Console.WriteLine("~~~~~~~~ TERMINAL CALCULATOR ~~~~~~~~");

        Console.WriteLine("1. Standard Calculator\n2. Quadratic Equation Solver\n3. Simple Interest Calculator");
        choice = int.Parse(Console.ReadLine());

        try
        {
            if (choice == 2)
            {
                Console.Write("Enter a value for 'a': ");
                double a = double.Parse(Console.ReadLine());

                Console.Write("Enter a value for 'b': ");
                double b = double.Parse(Console.ReadLine());

                Console.Write("Enter a value for 'c': ");
                double c = double.Parse(Console.ReadLine());

                //Quadratic Formula: x = (-b +- sqrt(b^2 - 4ac)) / 2a

                //Solve disriminant: (b*b) - (4*a*c)
                double discriminant = (b * b) - (4 * a * c);

                if (discriminant < 0)
                {
                    Console.WriteLine("No real solutions");
                    Console.ReadLine();
                }
                else
                {
                    double sqrt = Math.Sqrt(discriminant);
                    ans1 = (-b + sqrt) / (2 * a);
                    ans2 = (-b - sqrt) / (2 * a);
                    Console.WriteLine("{" + ans1 + " , " + ans2 + "}");
                    Console.ReadLine();
                }
            }

            if (choice == 1)
            {
                Console.Write("Enter first number: ");
                double num1 = double.Parse(Console.ReadLine());

                Console.Write("Enter second number (Enter 0 if you want to use sqrt): ");
                double num2 = double.Parse(Console.ReadLine());

                //Prompt user to choose an operation
                Console.WriteLine("Choose a math operator:\n1. +\n2. -\n3. x\n4. /\n5. ^\n6. Square root");
                int mathOpr = int.Parse(Console.ReadLine());

                if (mathOpr == 1)
                {
                    double answer = num1 + num2;
                    Console.WriteLine("\n\n" + answer);

                    Console.ReadLine();
                }

                if (mathOpr == 2)
                {
                    double answer = num1 - num2;
                    Console.WriteLine("\n\n" + answer);

                    Console.ReadLine();
                }

                if (mathOpr == 3)
                {
                    double answer = num1 * num2;
                    Console.WriteLine("\n\n" + answer);

                    Console.ReadLine();
                }

                if (mathOpr == 4)
                {
                    double answer = num1 / num2;
                    Console.WriteLine("\n\n" + answer);

                    Console.ReadLine();
                }

                if (mathOpr == 5)
                {
                    double answer = Math.Pow(num1, num2);
                    Console.WriteLine("\n\n" + answer);

                    Console.ReadLine();
                }

                if (mathOpr == 6)
                {
                    if (num1 < 0)
                    {
                        Console.WriteLine("\n\nNo real solutions");
                    }

                    else
                    {
                        double answer = Math.Sqrt(num1);
                        Console.WriteLine("\n\n" + answer);
                    }
                }

                else
                {
                    Console.WriteLine("That is not a valid option, idiot.");

                    Console.ReadLine();
                }
            }

            if (choice == 3)
            {
                Console.WriteLine("Enter initial amount: ");
                double initAmount = double.Parse(Console.ReadLine());

                Console.WriteLine("Enter interest rate (ex. 6% = .06): ");
                double rate = double.Parse(Console.ReadLine());

                Console.WriteLine("Enter time range (Year, Month, Week, etc.): ");
                string timeRange = Console.ReadLine();

                Console.WriteLine("Enter amount of " + timeRange.ToLower() + "s: ");
                int time = int.Parse(Console.ReadLine());

                for (int time2 = 1; time2 <= time; time2++)
                {
                    double totalAmount = initAmount * Math.Pow(1 + rate, time2);
                    Console.WriteLine("\n" + timeRange + " " + time2 + " ---------- " + totalAmount);
                }

                Console.ReadLine();
            }
        }
        catch 
        {
            Console.WriteLine("That is not a valid option.");
        }
    }
}

person pcnThird    schedule 20.12.2012    source источник
comment
Мнимые числа или числа, сгенерированные системой?   -  person bonCodigo    schedule 20.12.2012
comment
@bonCodigo: мнимые числа.   -  person pcnThird    schedule 20.12.2012
comment
проверить это stackoverflow.com/questions/1452276/complex-number-notation также выполните поиск в Google для сложных чисел с C # stackoverflow   -  person MethodMan    schedule 20.12.2012
comment
stackoverflow.com/ вопросы/10252740/   -  person MethodMan    schedule 20.12.2012
comment
Тогда вам стоит подумать о смене школы.   -  person phant0m    schedule 20.12.2012


Ответы (2)


Переверните дискриминант и умножьте на i:

double discriminate = (b*b)-(4*a*c);
if(discriminate < 0){
    double x1 = -b/(2*a);
    discriminate = -discriminate ;
    double x2 = Math.Sqrt(discriminate)/(2*a);
    double x3 = -Math.Sqrt(discriminate)/(2*a);
}
Console.WriteLine(x1.ToString() + " + " + x2.ToString() + " * i ");
Console.WriteLine(x1.ToString() + " + " + x3.ToString() + " * i ");
person Foggzie    schedule 20.12.2012
comment
Это то, что вы имели в виду: if (дискриминант ‹ 0) { double x1 = -b / (2 * a); дискриминант = -дискриминант; двойной x2 = Math.Sqrt(дискриминант) / (2 * a); double x3 = -Math.Sqrt(дискриминант)/(2 * a); Console.WriteLine(x1 + (x2 * Math.Sqrt(-1))); Console.WriteLine(x1 + (x3 * Math.Sqrt(-1))); Консоль.ReadLine(); } - person pcnThird; 20.12.2012
comment
Программа выводит NaN(не число), к сожалению, а может я что-то не так делаю. До этого я пробовал это: vcskicks.com/quadratic-formula.php, но он по-прежнему показывал NaN в качестве ответа. - person pcnThird; 20.12.2012
comment
Это потому, что ответ не является реальным числом. Значение Math.Sqrt(-1) не может быть представлено числом с плавающей запятой или двойным значением. Вы WriteLines все еще пытаетесь вычислить sqrt (-1). Вместо этого просто добавьте *i в конец строки. - person Foggzie; 20.12.2012
comment
Поскольку «i» эквивалентно квадратному корню из (-1), я решил, что Math.Sqrt(-1) также будет работать, но я пропустил использование «двойного» в этом случае. Итак, как правильно это сделать? Спасибо. - person pcnThird; 20.12.2012
comment
Это потому, что ответ не является реальным числом. Значение Math.Sqrt(-1) не может быть представлено числом с плавающей запятой или двойным значением. Вы WriteLines все еще пытаетесь вычислить sqrt (-1). Вместо этого просто добавьте *i в конец строки. Понятно. Я попробую сейчас. - person pcnThird; 20.12.2012
comment
Вы просто не ставите ответ в двойном. Вы форматируете его как строку. Я снова отредактировал свой ответ. - person Foggzie; 20.12.2012

Если дискриминант отрицательный, можете ли вы просто поменять знак дискриминанта, вычислить корень, а затем добавить i в конец результата?

person Jonathan Huss    schedule 20.12.2012