Как вывести мнимый корень квадратного уравнения на c?

#c #complex-numbers

#c #комплексные числа

Вопрос:

Мне нужно вывести мнимый корень в квадратном уравнении. но когда я выполняю свой код, результат показывает мне, что мнимый корень равен 0,00000i . даже я использую to <complex.h> тоже самое.

Кто-нибудь может помочь мне проверить код, который я выделил жирным шрифтом?

 //C program to find the root of the quadratic equation
#include<stdio.h>
#include<math.h>
#include<complex.h>

int main()
{
    double  a, b, c, x, x1, x2, disc, xr, ximg1, ximg2;
    
    printf("Please enter the value of quadratic equation, a: ");
    scanf("%lf", amp;a);
    printf("Please enter the value of quadratic equation, b: ");
    scanf("%lf", amp;b);
    printf("Please enter the value of quadratic equation, c: ");
    scanf("%lf", amp;c);

    if( a == 0 )
    {
        x = -(c/b);
        printf("nThis is not a quadratic equation.n");
        printf("x = %.3lf", x);
    }
    else{
    disc = (b*b) - 4*a*c;
        if( disc == 0 ){
             x1 = -b / 2 * a;
             x2 = -b / 2 * a;
             printf("x1 = %lf, x2 = %lf", x1, x2);
        }
        else if(disc > 0){
            x1 = ( -b   sqrt( disc ) ) / 2 * a;
            x2 = ( -b - sqrt( disc ) ) / 2 * a;
            printf("x1 = %.1lf, x2 = %.1lf", x1, x2);
        }
        else{
            ximg1 = sqrt( disc ) / 2 * a;
            ximg2 = - sqrt( disc ) / 2 * a;
            xr = - b / ( 2 * a );
            **printf("xr = %lf, ximg1 = %lfi, ximg2 = %lfi", crealf(xr), cimagf(ximg1), cimagf(ximg2));**
        }
    }

    return 0;
}
 

Выходные данные показаны как показано ниже:

 Please enter the value of quadratic equation, a: 4
Please enter the value of quadratic equation, b: 1
Please enter the value of quadratic equation, c: 3
xr = -0.125000, ximg1 = 0.000000i, ximg2 = 0.000000i
Process returned 0 (0x0)   execution time : 3.914 s
Press any key to continue.
 

Комментарии:

1. Вы хотите csqrt() (прототип в <complex.h> )

2. Не принимайте sqrt() отрицательного числа. Вы, вероятно, имели в виду sqrt(-disc)

3. Пожалуйста, никаких изображений текста

Ответ №1:

Вы должны печатать корни как комплексные числа, используя вычисленные действительную и мнимую части. Нет необходимости в <complex.h> сложных типах nor:

     double xr = - b / ( 2 * a );
    double ximg1 = -sqrt( -disc ) / (2 * a);
    double ximg2 = -ximg1;
    printf("x1 = %lf% lfi, x2 = %lf% lfin", xr, ximg1, xr, ximg2);
 

Ответ №2:

Поскольку вы использовали сложный заголовочный файл, вам просто нужно использовать csqrt() вместо sqrt(),

 //C program to find the root of the quadratic equation
#include<stdio.h>
#include<math.h>
#include<complex.h>

int main()
{
    double  a, b, c, x, x1, x2, disc, xr, ximg1, ximg2;
    
    printf("Please enter the value of quadratic equation, a: ");
    scanf("%lf", amp;a);
    printf("Please enter the value of quadratic equation, b: ");
    scanf("%lf", amp;b);
    printf("Please enter the value of quadratic equation, c: ");
    scanf("%lf", amp;c);

    if( a == 0 )
    {
        x = -(c/b);
        printf("nThis is not a quadratic equation.n");
        printf("x = %.3lf", x);
    }
    else{
    disc = (b*b) - 4*a*c;
        if( disc == 0 ){
             x1 = -b / 2 * a;
             x2 = -b / 2 * a;
             printf("x1 = %lf, x2 = %lf", x1, x2);
        }
        else if(disc > 0){
            x1 = ( -b   csqrt( disc ) ) / 2 * a;//changed the function here
            x2 = ( -b - csqrt( disc ) ) / 2 * a;//changed the function here
            printf("x1 = %.1lf, x2 = %.1lf", x1, x2);
        }
        else{
            ximg1 = sqrt( disc ) / 2 * a;
            ximg2 = - sqrt( disc ) / 2 * a;
            xr = - b / ( 2 * a );
            **printf("xr = %lf, ximg1 = %lfi, ximg2 = %lfi", crealf(xr), cimagf(ximg1), cimagf(ximg2));**
        }
    }

    return 0;
}
 

Ответ №3:

Сложные типы не нужны

Когда код достигает приведенного ниже, disc < 0 . Найдите квадратный корень из отрицания.

         // ximg1 = sqrt( disc ) / 2 * a;
        ximg1 = sqrt( -disc ) / 2 * a;     // Use -disc
        // ximg2 = - sqrt( disc ) / 2 * a;
        ximg2 = -ximg1;                    // Simply negate ximg1
        xr = - b / ( 2 * a );
        printf("xr = %lf, ximg1 = %lfi, ximg2 = %lfi", 
        // crealf(xr), cimagf(ximg1), cimagf(ximg2));
          xr, ximg1, ximg2);
 

Совет: используйте "%e" , это более информативно.

         printf("xr = %le, ximg1 = %lei, ximg2 = %lei", 
          xr, ximg1, ximg2);
 

Ошибка

Вместо / 2 * a; , в разных местах, конечно, вы хотите / (2 * a); .

Комментарии:

1. большое вам спасибо! Я успешно решил свою проблему. Я попытаюсь улучшить свой код и сделать его более эффективным.

2. Я также узнал, что я могу удалить <complex.h>, потому что комплексный тип не нужен, tqsm!!!