|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/av_htm_c/av18r_c.htm
Дата изменения: Fri Dec 4 13:01:52 2015 Дата индексирования: Sun Apr 10 01:34:30 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий av18r_c.zip av18d_c.zip |
Тексты тестовых примеров tav18r_c.zip tav18d_c.zip |
Построение плоского вращения Гивенса.
Для заданных вещественных чиceл А и В последовательно вычисляются величины
σ = sign(A) , если | A | ≥ | B |
σ = sign(B) , если | B | ≥ | A | ,
R = σ ( A2 + B2 )1/2 ,
C = A / R , если R ≠ 0
C = 1 , если R = 0 ,
S = B / R , если R ≠ 0
S = 0 , если R = 0 .
Полученные таким образом числа С, S и R удовлетворяют матричному уравнению
| C S | | A | | R |
| - S C | * | B | = | 0 |
Дж.Форсайт, М.Малькольм, К.Моулер. Машинные методы математических вычислений. М.: Мир, 1980.
int av18r_c (real *sa, real *sb, real *c, real *s)
Параметры
| sa - | вещественная переменная, в которой задается величина A; на выходе содержит вычисленное значение величины R; |
| sb - | вещественная переменная, в которой задается величина B; на выходе содержит вычисленное значение величины Z, где |
Z = S , если | A | > | B |
Z = 1 / C , если | B | ≥ | A | и C ≠ 0
Z = 1 , если C = 0 ;
| |
| c - | вещественная переменная, содержащая на выходе вычисленное значение величины C; |
| s - | вещественная переменная, содержащая на выходе вычисленное значение величины S; |
Версии
| av18d_c - | построение плоского вращения Гивенса для вещественных A и B, заданных с удвоенной точностью. |
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
В подпрограмме av18d_c переменные sa, sb, c, s имеют тип double. | |
| 2. |
Введение величины σ не является необходимым для построения матрицы вращения Гивенса, но позволяет однозначно восстанавливать C и S, зная лишь одно число Z, а именно: - если Z = 1, то C = 0 и S = 1; - если | Z | < 1, то C = ( 1 - Z2 )1/2 и S = Z; - если | Z | > 1, то C = 1/Z и S = ( 1 - C2 )1/2. |
int main(void)
{
/* Local variables */
extern int av18r_c(float *, float *, float *, float *, int *);
static int ierr;
static float c__, s, sa, sb;
sa = 4.2f;
sb = -3.7f;
av18r_c(&sa, &sb, &c__, &s, &ierr);
printf("\n %16.7e \n", sa);
printf("\n %16.7e \n", sb);
printf("\n %16.7e \n", c__);
printf("\n %16.7e \n", s);
printf("\n %5i \n", ierr);
return 0;
} /* main */
Результаты:
sa = 5.597 , sb = - 0.661 ,
c__ = 0.7503 , s = - 0.661