Текст подпрограммы и версий
av18r_c.zip  av18d_c.zip 
Тексты тестовых примеров
tav18r_c.zip  tav18d_c.zip 

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

Назначение

Построение плоского вращения Гивенса.

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

Для заданных вещественных чи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