|
libflame
revision_anchor
|
Functions | |
| FLA_Error | FLA_Givens2 (FLA_Obj chi_1, FLA_Obj chi_2, FLA_Obj gamma, FLA_Obj sigma, FLA_Obj chi_1_new) |
| FLA_Error | FLA_Givens2_ops (float *chi_1, float *chi_2, float *gamma, float *sigma, float *chi_1_new) |
| FLA_Error | FLA_Givens2_opd (double *chi_1, double *chi_2, double *gamma, double *sigma, double *chi_1_new) |
| FLA_Error FLA_Givens2 | ( | FLA_Obj | chi_1, |
| FLA_Obj | chi_2, | ||
| FLA_Obj | gamma, | ||
| FLA_Obj | sigma, | ||
| FLA_Obj | chi_1_new | ||
| ) |
References FLA_Check_error_level(), FLA_Givens2_check(), FLA_Givens2_opd(), FLA_Givens2_ops(), and FLA_Obj_datatype().
{
FLA_Datatype datatype;
datatype = FLA_Obj_datatype( chi_1 );
if ( FLA_Check_error_level() >= FLA_MIN_ERROR_CHECKING )
FLA_Givens2_check( chi_1, chi_2, gamma, sigma, chi_1_new );
switch ( datatype )
{
case FLA_FLOAT:
{
float* chi_1_p = ( float* ) FLA_FLOAT_PTR( chi_1 );
float* chi_2_p = ( float* ) FLA_FLOAT_PTR( chi_2 );
float* gamma_p = ( float* ) FLA_FLOAT_PTR( gamma );
float* sigma_p = ( float* ) FLA_FLOAT_PTR( sigma );
float* chi_1_new_p = ( float* ) FLA_FLOAT_PTR( chi_1_new );
FLA_Givens2_ops( chi_1_p,
chi_2_p,
gamma_p,
sigma_p,
chi_1_new_p );
break;
}
case FLA_DOUBLE:
{
double* chi_1_p = ( double* ) FLA_DOUBLE_PTR( chi_1 );
double* chi_2_p = ( double* ) FLA_DOUBLE_PTR( chi_2 );
double* gamma_p = ( double* ) FLA_DOUBLE_PTR( gamma );
double* sigma_p = ( double* ) FLA_DOUBLE_PTR( sigma );
double* chi_1_new_p = ( double* ) FLA_DOUBLE_PTR( chi_1_new );
FLA_Givens2_opd( chi_1_p,
chi_2_p,
gamma_p,
sigma_p,
chi_1_new_p );
break;
}
}
return FLA_SUCCESS;
}
| FLA_Error FLA_Givens2_opd | ( | double * | chi_1, |
| double * | chi_2, | ||
| double * | gamma, | ||
| double * | sigma, | ||
| double * | chi_1_new | ||
| ) |
References FLA_Mach_params_opd().
Referenced by FLA_Givens2().
{
double zero = 0.0;
double one = 1.0;
double two = 2.0;
double f = *chi_1;
double g = *chi_2;
double cs;
double sn;
double r;
int count, i;
double eps, f1, g1, safmin, safmin2, safmax2, scale;
double base;
safmin = FLA_Mach_params_opd( FLA_MACH_SFMIN );
eps = FLA_Mach_params_opd( FLA_MACH_EPS );
base = FLA_Mach_params_opd( FLA_MACH_BASE );
safmin2 = pow( base, ( double )(( int )( log( safmin / eps ) /
log( base ) /
two ) ) );
safmax2 = one / safmin2;
if ( g == zero )
{
cs = one;
sn = zero;
r = f;
}
else if ( f == zero )
{
cs = zero;
sn = one;
r = g;
}
else
{
f1 = f;
g1 = g;
scale = max( fabs( f1 ), fabs( g1 ) );
if ( scale >= safmax2 )
{
count = 0;
do
{
++count;
f1 = f1 * safmin2;
g1 = g1 * safmin2;
scale = max( fabs( f1 ), fabs( g1 ) );
}
while ( scale >= safmax2 );
r = sqrt( f1 * f1 + g1 * g1 );
cs = f1 / r;
sn = g1 / r;
for ( i = 0; i < count; ++i )
r = r * safmax2;
}
else if ( scale <= safmin2 )
{
count = 0;
do
{
++count;
f1 = f1 * safmax2;
g1 = g1 * safmax2;
scale = max( fabs( f1 ), fabs( g1 ) );
}
while ( scale <= safmin2 );
r = sqrt( f1 * f1 + g1 * g1 );
cs = f1 / r;
sn = g1 / r;
for ( i = 0; i < count; ++i )
r = r * safmin2;
}
else
{
r = sqrt( f1 * f1 + g1 * g1 );
cs = f1 / r;
sn = g1 / r;
}
if ( fabs( f ) > fabs ( g ) && cs < zero )
{
cs = -cs;
sn = -sn;
r = -r;
}
}
// Save the output values.
*gamma = cs;
*sigma = sn;
*chi_1_new = r;
return FLA_SUCCESS;
}
| FLA_Error FLA_Givens2_ops | ( | float * | chi_1, |
| float * | chi_2, | ||
| float * | gamma, | ||
| float * | sigma, | ||
| float * | chi_1_new | ||
| ) |
Referenced by FLA_Givens2().
{
return FLA_SUCCESS;
}
1.7.6.1