Текст подпрограммы и версий 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