Текст подпрограммы и версий
zp14r_c.zip  zp14c_c.zip 
Тексты тестовых примеров
tzp14r_c.zip  tzp14c_c.zip 

Подпрограмма:  zp14r_c

Назначение

Вычисление корней квадратного уравнения с вещественными коэффициентами.

Математическое описание

Подпрограмма zp14r_c вычисляет корни квадратного уравнения

          A*X2 + B*X + C  =  0.0  , 

в котором коэффициенты А, В и С являются вещественными. Вычисленные корни RООТ1 и RООТ2 в общем случае являются комплексными.

Алгоритм, реализованный в подпрограмме, изложен в статье

G.F.Forsythe, What Is a Satisfactory Quadratic Еquation Solver., Сonstructive Аspects of тне Fundamental Тheorem of Аlgebra, В.Dejon and Р.Нenrici eds., Wiley - Interscience, New York, 1969.

Использование

    int zp14r_c (real *a, real *b, real *c, complex *root1,
        complex *root2, integer *ierr)

Параметры

a, b, c - заданные коэффициенты квадратного уравнения (тип: вещественный);
 root1 -
 root2  
комплексные переменные, содержащие вычисленные корни квадратного уравнения;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом
ierr=65 - когда старшие коэффициенты a и b равны 0.0; в этом случае первый корень полагается равным комплексному числу (- 3.4e38, 0.0), а второй (3.4e38, 0.0);
ierr=66 - когда старший коэффициент a равен 0.0; в этом случае второй корень полагается равным комплексному числу (3.4e38, 0.0).

Версии

zp14c_c - вычисляет корни квадратного уравнения с комплексными коэффициентами. Тем самым, коэффициенты a, b и c должны иметь тип complex.

Вызываемые подпрограммы

utzp10_c - подпрограмма выдачи диагностических сообщений при работе подпрограмм zp14r_c и zp14c_c.

Замечания по использованию: нет

Примеры использования

1.
int main(void)
{
    /* Local variables */
    static int ierr;
    extern int zp14r_c(float *, float *, float *, complex *,
                       complex *, int *);
    static float a1, a2, a3;
    static complex z1, z2;

    a1 = 1.f;
    a2 = -3.f;
    a3 = 2.f;
    zp14r_c(&a1, &a2, &a3, &z1, &z2, &ierr);

    printf("\n %16.7e %16.7e %16.7e \n", a1, a2, a3);
    printf("\n %16.7e %16.7e \n", z1.r, z1.i);
    printf("\n %16.7e %16.7e \n", z2.r, z2.i);
    printf("\n %5i \n", ierr);
    return 0;
} /* main */


Результаты:
    
       z1 = (1.0, 0.0) ,  z2 = (2.0, 0.0) ,
       ierr  =  0

2.
int main(void)
{
    /* Local variables */
    extern int zp14c_c(complex *, complex *, complex *, complex *,
                       complex *, int *);
    static int ierr;
    static complex a, b, c__, z1, z2;

    a.r = 1.f, a.i = 0.f;
    b.r = 1.f, b.i = 3.f;
    c__.r = -2.f, c__.i = 1.f;
    zp14c_c(&a, &b, &c__, &z1, &z2, &ierr);

    printf("\n %16.7e %16.7e \n", a.r, a.i);
    printf("\n   %16.7e %16.7e \n", b.r, b.i);
    printf("\n %16.7e %16.7e \n", c__.r, c__.i);
    printf("\n    %16.7e %16.7e \n", z1.r, z1.i);
    printf("\n %16.7e %16.7e \n", z2.r, z2.i);
    printf("\n %5i \n", ierr);
    return 0;
} /* main */


Результаты:
    
       z1 = (0.0, - 1.0) ,  z2 = (- 1.0, - 2.0) ,
       ierr  =  0