Текст подпрограммы и версий
zp16r_c.zip  zp16d_c.zip 
Тексты тестовых примеров
tzp16r_c.zip  tzp16d_c.zip 

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

Назначение

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

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

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

     A(1)*X3 + A(2)*X2 + A(3)*X + A(4)  =  0.0  , 

в котором коэффициенты  А ( I ),  I = 1, 2, 3, 4 являются вещественными. Вычисленные корни в общем случае являются комплексными.

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

    int zp16r_c (real *a, integer *nreal, real *root,
            integer *ierr)

Параметры

a - вещественный вектор длины 4, содержащий коэффициенты уравнения третьей степени;
nreal - целая переменная, значение которой в результате работы подпрограммы полагается равным числу вещественных корней;
root - вещественный вектор длины 3, содержащий вычисленные корни;
ierr - целая переменная, значение которой в результате работы подпрограммы полагается равным 65, если коэффициент  A (1) равен 0.

Версии

zp16d_c - вычисление корней уравнения третьей степени с повышенной точностью. При этом векторы a и root должны иметь тип double.

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

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

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

 

Если все три корня являются вещественными, то они располагаются в возрастающем порядке root (1) ≤ root (2) ≤ root (3).

В случае двух комплексных корней, root (1) полагается равным вещественному корню, root (2) равняется вещественной части обоих комплексных корней, а root (3) - мнимой части, причем root (3) всегда положителен.

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

int main(void)
{
    /* Initialized data */
    static float a[4] = { 1.f,-6.f,11.f,-6.f };

    /* Local variables */
    static int ierr;
    extern int zp16r_c(float *, int *, float *, int *);
    static float root[3];
    static int nreal, i__;

    zp16r_c(a, &nreal, root, &ierr);

    for (i__ = 1; i__ <= 4; ++i__) {
         printf("\n %16.7e \n", a[i__ - 1]);
    }
    printf("\n %5i \n", nreal);
    printf("\n %16.7e %16.7e %16.7e \n", root[0], root[1], root[2]);
    printf("\n %5i \n", ierr);
    return 0;
} /* main */


Результаты:

       root(1) = 1. ,  root(2) = 2. ,  root(3) = 3. ,
       nreal   =  3 ,  ierr  = 0