|
Текст подпрограммы и версий adt1r_c.zip , adt1d_c.zip , adt1c_c.zip |
Тексты тестовых примеров tadt1r_c.zip , tadt1d_c.zip , tadt1c_c.zip |
Вычисление определителя вещественной треугольной матрицы, заданной в компактной форме.
Для заданной в компактной форме вещественной треугольной матрицы А порядка N вычисляется определитель как произведение ее диагональных элементов и записывается в виде
det A = D1*10D2, где 1.0 ≤ D1 < 10.0.
Дж. Форсайт, М. Малькольм, К. Моулер. Машинные методы математических вычислений. М.: Мир, 1980.
int adt1r_c (real *a, integer *n, real *det1, real *det2,
integer *ierr)
Параметры
| a - | вектор длины n на (n+1)/2, в котором последовательно записаны столбцы (для верхней треугольной) или строки (для нижней треугольной) матрицы a (тип: вещественный); |
| n - | порядок матрицы a (тип: целый); |
| det1 - | вещественная переменная, содержащая на выходе мантиссу определителя; |
| det2 - | вещественная переменная, содержащая на выходе десятичный порядок определителя; |
| ierr - | целая переменная, содержащая на выходе информацию о прохождении счета, при этом: |
| ierr=65 - | если n ≤ 0; |
| ierr=66 - | если в процессе работы произошло переполнение (это говорит о том, что некоторые диагональные элементы матрицы a имеют порядок, равный s - 1, где s - максимальный порядок для вещественных чисел на данной машине); |
| ierr=-k - | где k - номер строки матрицы a с нулевым диагональным элементом (это свидетельствует о вырожденности матрицы a). Если таких строк несколько, то значение k равно номеру первой из них (см. замечания по использованию). |
Версии
| adt1d_c - | вычисление определителя вещественной треугольной матрицы, заданной в компактной форме с удвоенной точностью. |
| adt1c_c - | вычисление определителя комплексной треугольной матрицы, заданной в компактной форме. |
Вызываемые подпрограммы
| utafsi_c - | подпрограмма выдачи диагностических сообщений. |
Замечания по использованию
| 1. |
В подпрограмме adt1d_c массив a и переменные det1 и det2 имеют тип double. | |
| 2. |
В подпрограмме adt1c_c массив a и переменная det1 имеют тип complex. | |
| 3. | Если переменной ierr присваивается значение, отличное от нуля, то выдается соответствующее диагностическое сообщение, полагается det1 = 0.0, det2 = 0.0 и происходит выход из подпрограммы. |
int main(void)
{
/* Local variables */
static int ierr;
extern int adt1r_c(float *, int *, float *, float *, int *);
static float a[15];
static int i__, j, k, na, naa;
static float det1, det2;
int i__1, i__2;
na = 5;
naa = 15;
k = 0;
i__1 = na;
for (i__ = 1; i__ <= i__1; ++i__) {
i__2 = i__;
for (j = 1; j <= i__2; ++j) {
++k;
a[k - 1] = (float) (i__ * 10 + j);
/* l3: */
}
/* l4: */
}
adt1r_c(a, &na, &det1, &det2, &ierr);
i__1 = naa;
for (i__ = 1; i__ <= i__1; ++i__) {
printf("\n %16.7e \n",a[i__ - 1]);
}
printf("\n %5i \n",ierr);
printf("\n %16.7e \n",det1);
printf("\n %16.7e \n",det2);
return 0;
} /* main */
Результаты:
det1 = 1.932612
det2 = 7.0