ASSERT_DBL_NEAR_TOL((double)(tr_max), (double)(te_max), SINGLE_EPS);
}
+CTEST (drotmg,rotmg){
+ double te_d1, tr_d1;
+ double te_d2, tr_d2;
+ double te_x1, tr_x1;
+ double te_y1, tr_y1;
+ double te_param[5];
+ double tr_param[5];
+ int i=0;
+ // original test case for libGoto bug fixed by feb2014 rewrite
+ te_d1= 0.21149573940783739;
+ te_d2= 0.046892057172954082;
+ te_x1= -0.42272687517106533;
+ te_y1= 0.42211309121921659;
+
+
+ for(i=0; i<5; i++){
+ te_param[i]=tr_param[i]=0.0;
+ }
+
+ //reference values as calulated by netlib blas
+
+ tr_d1= 0.1732048;
+ tr_d2= 0.03840234;
+ tr_x1= -0.516180;
+ tr_y1= 0.422113;
+ tr_d1= 0.17320483687975;
+ tr_d2= 0.03840233915037;
+ tr_x1= -0.51618034832329;
+ tr_y1= 0.42211309121922;
+
+ tr_param[0]= 0.0;
+ tr_param[1]= 0.0;
+ tr_param[2]= 0.99854803659786;
+ tr_param[3]= -0.22139439665872;
+ tr_param[4]= 0.0;
+
+ BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param);
+ ASSERT_DBL_NEAR_TOL(te_d1, tr_d1, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_d2, tr_d2, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_x1, tr_x1, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_y1, tr_y1, DOUBLE_EPS);
+
+ for(i=0; i<5; i++){
+ ASSERT_DBL_NEAR_TOL(te_param[i], tr_param[i], DOUBLE_EPS);
+ }
+}
+
+CTEST (drotmg,rotmg_issue1452){
+ double te_d1, tr_d1;
+ double te_d2, tr_d2;
+ double te_x1, tr_x1;
+ double te_y1, tr_y1;
+ double te_param[5];
+ double tr_param[5];
+ int i=0;
+
+ // from issue #1452, buggy version returned 0.000244 for param[3]
+ te_d1 = 5.9e-8;
+ te_d2 = 5.960464e-8;
+ te_x1 = 1.0;
+ te_y1 = 150.0;
+
+ for(i=0; i<5; i++){
+ te_param[i]=tr_param[i]=0.0;
+ }
+
+ //reference values as calulated by netlib blas
+ tr_d1= 0.99995592822897;
+ tr_d2= 0.98981219860583;
+ tr_x1= 0.03662270484346;
+ tr_y1= 150.000000000000;
+
+ tr_param[0]= -1.0;
+ tr_param[1]= 0.00000161109346;
+ tr_param[2]= -0.00024414062500;
+ tr_param[3]= 1.0;
+ tr_param[4]= 0.00000162760417;
+
+ //OpenBLAS
+ BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param);
+
+ ASSERT_DBL_NEAR_TOL(te_d1, tr_d1, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_d2, tr_d2, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_x1, tr_x1, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_y1, tr_y1, DOUBLE_EPS);
+
+ for(i=0; i<5; i++){
+ ASSERT_DBL_NEAR_TOL(te_param[i], tr_param[i], DOUBLE_EPS);
+ }
+
+}
+
+CTEST(drotmg, rotmg_D1eqD2_X1eqX2){
+ double te_d1, tr_d1;
+ double te_d2, tr_d2;
+ double te_x1, tr_x1;
+ double te_y1, tr_y1;
+ double te_param[5];
+ double tr_param[5];
+ int i=0;
+ te_d1= tr_d1=2.;
+ te_d2= tr_d2=2.;
+ te_x1= tr_x1=8.;
+ te_y1= tr_y1=8.;
+
+ for(i=0; i<5; i++){
+ te_param[i]=tr_param[i]=0.0;
+ }
+
+ //reference values as calulated by netlib blas
+ tr_d1= 1.0;
+ tr_d2= 1.0;
+ tr_x1= 16.0;
+ tr_y1= 8.0;
+
+ tr_param[0]=1.0;
+ tr_param[1]=1.0;
+ tr_param[2]=0.0;
+ tr_param[3]=0.0;
+ tr_param[4]=1.0;
+
+ //OpenBLAS
+ BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param);
+
+ ASSERT_DBL_NEAR_TOL(te_d1, tr_d1, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_d2, tr_d2, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_x1, tr_x1, DOUBLE_EPS);
+ ASSERT_DBL_NEAR_TOL(te_y1, tr_y1, DOUBLE_EPS);
+
+ for(i=0; i<5; i++){
+ ASSERT_DBL_NEAR_TOL(te_param[i], tr_param[i], DOUBLE_EPS);
+ }
+}
+
int main(int argc, const char ** argv){
CTEST_ADD(amax, samax);