Fixed over/under-flow in complex inversion.

Details:
- Fixed the complex bli_?inverts() macros, which were inverting elements
  in an "unsafe" manner, such that very large and very small values were
  unnecessarily over/under-flowing. Thanks for Vladimir Sukharev for
  reporting this bug.
- Comment update to bli_sumsqv_unb_var1.c.
- Removed redundant bli_min() macro in bli_scalar_macro_defs.h.
- Changed 1.0F to 1.0 for bli_drands() macro.
This commit is contained in:
Field G. Van Zee
2013-10-24 14:32:20 -05:00
parent 45a80c625f
commit 2807013a47
6 changed files with 62 additions and 51 deletions

View File

@@ -57,18 +57,22 @@
#define bli_cinverts( x ) \
{ \
float temp = ( bli_creal(x) * bli_creal(x) + \
bli_cimag(x) * bli_cimag(x) ); \
bli_creal(x) = bli_creal(x) / temp; \
bli_cimag(x) = bli_cimag(x) / -temp; \
float s = bli_fmax( bli_creal(x), bli_cimag(x) ); \
float xr_s = bli_creal(x) / s; \
float xi_s = bli_cimag(x) / s; \
float temp = ( xr_s * bli_creal(x) + xi_s * bli_cimag(x) ); \
bli_creal(x) = xr_s / temp; \
bli_cimag(x) = -xi_s / temp; \
}
#define bli_zinverts( x ) \
{ \
double temp = ( bli_zreal(x) * bli_zreal(x) + \
bli_zimag(x) * bli_zimag(x) ); \
bli_zreal(x) = bli_zreal(x) / temp; \
bli_zimag(x) = bli_zimag(x) / -temp; \
double s = bli_fmax( bli_zreal(x), bli_zimag(x) ); \
double xr_s = bli_zreal(x) / s; \
double xi_s = bli_zimag(x) / s; \
double temp = ( xr_s * bli_zreal(x) + xi_s * bli_zimag(x) ); \
bli_zreal(x) = xr_s / temp; \
bli_zimag(x) = -xi_s / temp; \
}

View File

@@ -93,19 +93,21 @@
}
#define bli_ccinvscaljs( a, x ) \
{ \
float temp = ( float ) bli_ccimulnc_r( (a), (a) ); \
float xr = ( float ) bli_ccimulnn_r( (a), (x) ) / temp; \
float xi = ( float ) bli_ccimulnn_i( (x), (a) ) / temp; \
bli_creal(x) = xr; \
bli_cimag(x) = xi; \
float s = ( float )bli_fmax( bli_creal(a), bli_cimag(a) ); \
float ar_s = ( float )bli_creal(a) / s; \
float ai_s = ( float )bli_cimag(a) / s; \
float temp = ( ar_s * ( float )bli_creal(a) + ai_s * ( float )bli_cimag(a) ); \
bli_creal(x) = ( bli_creal(x) * ar_s - bli_cimag(x) * ai_s ) / temp; \
bli_cimag(x) = ( bli_cimag(x) * ar_s + bli_creal(x) * ai_s ) / temp; \
}
#define bli_zcinvscaljs( a, x ) \
{ \
float temp = ( float ) bli_zzimulnc_r( (a), (a) ); \
float xr = ( float ) bli_zcimulnn_r( (a), (x) ) / temp; \
float xi = ( float ) bli_czimulnn_i( (x), (a) ) / temp; \
bli_creal(x) = xr; \
bli_cimag(x) = xi; \
double s = ( double )bli_fmax( bli_zreal(a), bli_zimag(a) ); \
double ar_s = ( double )bli_zreal(a) / s; \
double ai_s = ( double )bli_zimag(a) / s; \
double temp = ( ar_s * ( double )bli_zreal(a) + ai_s * ( double )bli_zimag(a) ); \
bli_creal(x) = ( bli_creal(x) * ar_s - bli_cimag(x) * ai_s ) / temp; \
bli_cimag(x) = ( bli_cimag(x) * ar_s + bli_creal(x) * ai_s ) / temp; \
}
@@ -121,19 +123,21 @@
}
#define bli_czinvscaljs( a, x ) \
{ \
double temp = ( double ) bli_ccimulnc_r( (a), (a) ); \
double xr = ( double ) bli_czimulnn_r( (a), (x) ) / temp; \
double xi = ( double ) bli_zcimulnn_i( (x), (a) ) / temp; \
bli_zreal(x) = xr; \
bli_zimag(x) = xi; \
double s = ( double )bli_fmax( bli_creal(a), bli_cimag(a) ); \
double ar_s = ( double )bli_creal(a) / s; \
double ai_s = ( double )bli_cimag(a) / s; \
double temp = ( ar_s * ( double )bli_creal(a) + ai_s * ( double )bli_cimag(a) ); \
bli_zreal(x) = ( bli_zreal(x) * ar_s - bli_zimag(x) * ai_s ) / temp; \
bli_zimag(x) = ( bli_zimag(x) * ar_s + bli_zreal(x) * ai_s ) / temp; \
}
#define bli_zzinvscaljs( a, x ) \
{ \
double temp = ( double ) bli_zzimulnc_r( (a), (a) ); \
double xr = ( double ) bli_zzimulnn_r( (a), (x) ) / temp; \
double xi = ( double ) bli_zzimulnn_i( (x), (a) ) / temp; \
bli_zreal(x) = xr; \
bli_zimag(x) = xi; \
double s = ( double )bli_fmax( bli_zreal(a), bli_zimag(a) ); \
double ar_s = ( double )bli_zreal(a) / s; \
double ai_s = ( double )bli_zimag(a) / s; \
double temp = ( ar_s * ( double )bli_zreal(a) + ai_s * ( double )bli_zimag(a) ); \
bli_zreal(x) = ( bli_zreal(x) * ar_s - bli_zimag(x) * ai_s ) / temp; \
bli_zimag(x) = ( bli_zimag(x) * ar_s + bli_zreal(x) * ai_s ) / temp; \
}

View File

@@ -93,19 +93,21 @@
}
#define bli_ccinvscals( a, x ) \
{ \
float temp = ( float ) bli_ccimulnc_r( (a), (a) ); \
float xr = ( float ) bli_ccimulnc_r( (a), (x) ) / temp; \
float xi = ( float ) bli_ccimulnc_i( (x), (a) ) / temp; \
bli_creal(x) = xr; \
bli_cimag(x) = xi; \
float s = ( float )bli_fmax( bli_creal(a), bli_cimag(a) ); \
float ar_s = ( float )bli_creal(a) / s; \
float ai_s = ( float )bli_cimag(a) / s; \
float temp = ( ar_s * ( float )bli_creal(a) + ai_s * ( float )bli_cimag(a) ); \
bli_creal(x) = ( bli_creal(x) * ar_s + bli_cimag(x) * ai_s ) / temp; \
bli_cimag(x) = ( bli_cimag(x) * ar_s - bli_creal(x) * ai_s ) / temp; \
}
#define bli_zcinvscals( a, x ) \
{ \
float temp = ( float ) bli_zzimulnc_r( (a), (a) ); \
float xr = ( float ) bli_zcimulnc_r( (a), (x) ) / temp; \
float xi = ( float ) bli_czimulnc_i( (x), (a) ) / temp; \
bli_creal(x) = xr; \
bli_cimag(x) = xi; \
double s = ( double )bli_fmax( bli_zreal(a), bli_zimag(a) ); \
double ar_s = ( double )bli_zreal(a) / s; \
double ai_s = ( double )bli_zimag(a) / s; \
double temp = ( ar_s * ( double )bli_zreal(a) + ai_s * ( double )bli_zimag(a) ); \
bli_creal(x) = ( bli_creal(x) * ar_s + bli_cimag(x) * ai_s ) / temp; \
bli_cimag(x) = ( bli_cimag(x) * ar_s - bli_creal(x) * ai_s ) / temp; \
}
@@ -121,19 +123,21 @@
}
#define bli_czinvscals( a, x ) \
{ \
double temp = ( double ) bli_ccimulnc_r( (a), (a) ); \
double xr = ( double ) bli_czimulnc_r( (a), (x) ) / temp; \
double xi = ( double ) bli_zcimulnc_i( (x), (a) ) / temp; \
bli_zreal(x) = xr; \
bli_zimag(x) = xi; \
double s = ( double )bli_fmax( bli_creal(a), bli_cimag(a) ); \
double ar_s = ( double )bli_creal(a) / s; \
double ai_s = ( double )bli_cimag(a) / s; \
double temp = ( ar_s * ( double )bli_creal(a) + ai_s * ( double )bli_cimag(a) ); \
bli_zreal(x) = ( bli_zreal(x) * ar_s + bli_zimag(x) * ai_s ) / temp; \
bli_zimag(x) = ( bli_zimag(x) * ar_s - bli_zreal(x) * ai_s ) / temp; \
}
#define bli_zzinvscals( a, x ) \
{ \
double temp = ( double ) bli_zzimulnc_r( (a), (a) ); \
double xr = ( double ) bli_zzimulnc_r( (a), (x) ) / temp; \
double xi = ( double ) bli_zzimulnc_i( (x), (a) ) / temp; \
bli_zreal(x) = xr; \
bli_zimag(x) = xi; \
double s = ( double )bli_fmax( bli_zreal(a), bli_zimag(a) ); \
double ar_s = ( double )bli_zreal(a) / s; \
double ai_s = ( double )bli_zimag(a) / s; \
double temp = ( ar_s * ( double )bli_zreal(a) + ai_s * ( double )bli_zimag(a) ); \
bli_zreal(x) = ( bli_zreal(x) * ar_s + bli_zimag(x) * ai_s ) / temp; \
bli_zimag(x) = ( bli_zimag(x) * ar_s - bli_zreal(x) * ai_s ) / temp; \
}

View File

@@ -48,7 +48,7 @@
{ \
(a) = ( double ) ( ( double ) rand() / \
( ( double ) RAND_MAX / 2.0 ) \
) - 1.0F; \
) - 1.0; \
}
#define bli_crands( a ) \
{ \