mirror of
https://github.com/amd/blis.git
synced 2026-04-20 15:48:50 +00:00
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:
@@ -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; \
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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; \
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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; \
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
{ \
|
||||
(a) = ( double ) ( ( double ) rand() / \
|
||||
( ( double ) RAND_MAX / 2.0 ) \
|
||||
) - 1.0F; \
|
||||
) - 1.0; \
|
||||
}
|
||||
#define bli_crands( a ) \
|
||||
{ \
|
||||
|
||||
Reference in New Issue
Block a user