testautomation_math: do relative comparison + more precise correct trigonometric values

This commit is contained in:
Anonymous Maarten 2023-10-14 03:23:01 +02:00 committed by Anonymous Maarten
parent 811adaa342
commit 880c69392a

View file

@ -102,8 +102,15 @@ helper_dtod_inexact(const char *func_name, d_to_d_func func,
Uint32 i; Uint32 i;
for (i = 0; i < cases_size; i++) { for (i = 0; i < cases_size; i++) {
const double result = func(cases[i].input); const double result = func(cases[i].input);
SDLTest_AssertCheck(result >= cases[i].expected - EPSILON && double diff = result - cases[i].expected;
result <= cases[i].expected + EPSILON, double max_err = (cases[i].expected + 1.) * EPSILON;
if (diff < 0) {
diff = -diff;
}
if (max_err < 0) {
max_err = -max_err;
}
SDLTest_AssertCheck(diff <= max_err,
"%s(%f), expected [%f,%f], got %f", "%s(%f), expected [%f,%f], got %f",
func_name, func_name,
cases[i].input, cases[i].input,
@ -157,8 +164,16 @@ helper_ddtod_inexact(const char *func_name, dd_to_d_func func,
Uint32 i; Uint32 i;
for (i = 0; i < cases_size; i++) { for (i = 0; i < cases_size; i++) {
const double result = func(cases[i].x_input, cases[i].y_input); const double result = func(cases[i].x_input, cases[i].y_input);
SDLTest_AssertCheck(result >= cases[i].expected - EPSILON && double diff = result - cases[i].expected;
result <= cases[i].expected + EPSILON, double max_err = (cases[i].expected + 1.) * EPSILON;
if (diff < 0) {
diff = -diff;
}
if (max_err < 0) {
max_err = -max_err;
}
SDLTest_AssertCheck(diff <= max_err,
"%s(%f,%f), expected [%f,%f], got %f", "%s(%f,%f), expected [%f,%f], got %f",
func_name, func_name,
cases[i].x_input, cases[i].y_input, cases[i].x_input, cases[i].y_input,
@ -1655,7 +1670,7 @@ pow_regularCases(void *args)
{ 39.23, -1.5, 0.0040697950366865498147972424192175822099670767784118652343750 }, { 39.23, -1.5, 0.0040697950366865498147972424192175822099670767784118652343750 },
{ 478.972, 12.125, 315326359630449587856007411793920.0 } { 478.972, 12.125, 315326359630449587856007411793920.0 }
}; };
return helper_ddtod("Pow", SDL_pow, regular_cases, SDL_arraysize(regular_cases)); return helper_ddtod_inexact("Pow", SDL_pow, regular_cases, SDL_arraysize(regular_cases));
} }
/** /**
@ -1983,24 +1998,24 @@ static int
cos_precisionTest(void *args) cos_precisionTest(void *args)
{ {
const d_to_d precision_cases[] = { const d_to_d precision_cases[] = {
{ M_PI * 1.0 / 10.0, 0.9510565162 }, { M_PI * 1.0 / 10.0, 0.9510565162951535 },
{ M_PI * 2.0 / 10.0, 0.8090169943 }, { M_PI * 2.0 / 10.0, 0.8090169943749475 },
{ M_PI * 3.0 / 10.0, 0.5877852522 }, { M_PI * 3.0 / 10.0, 0.5877852522924731 },
{ M_PI * 4.0 / 10.0, 0.3090169943 }, { M_PI * 4.0 / 10.0, 0.30901699437494745 },
{ M_PI * 5.0 / 10.0, 0.0 }, { M_PI * 5.0 / 10.0, 0.0 },
{ M_PI * 6.0 / 10.0, -0.3090169943 }, { M_PI * 6.0 / 10.0, -0.30901699437494734 },
{ M_PI * 7.0 / 10.0, -0.5877852522 }, { M_PI * 7.0 / 10.0, -0.587785252292473 },
{ M_PI * 8.0 / 10.0, -0.8090169943 }, { M_PI * 8.0 / 10.0, -0.8090169943749473 },
{ M_PI * 9.0 / 10.0, -0.9510565162 }, { M_PI * 9.0 / 10.0, -0.9510565162951535 },
{ M_PI * -1.0 / 10.0, 0.9510565162 }, { M_PI * -1.0 / 10.0, 0.9510565162951535 },
{ M_PI * -2.0 / 10.0, 0.8090169943 }, { M_PI * -2.0 / 10.0, 0.8090169943749475 },
{ M_PI * -3.0 / 10.0, 0.5877852522 }, { M_PI * -3.0 / 10.0, 0.5877852522924731 },
{ M_PI * -4.0 / 10.0, 0.3090169943 }, { M_PI * -4.0 / 10.0, 0.30901699437494745 },
{ M_PI * -5.0 / 10.0, 0.0 }, { M_PI * -5.0 / 10.0, 0.0 },
{ M_PI * -6.0 / 10.0, -0.3090169943 }, { M_PI * -6.0 / 10.0, -0.30901699437494734 },
{ M_PI * -7.0 / 10.0, -0.5877852522 }, { M_PI * -7.0 / 10.0, -0.587785252292473 },
{ M_PI * -8.0 / 10.0, -0.8090169943 }, { M_PI * -8.0 / 10.0, -0.8090169943749473 },
{ M_PI * -9.0 / 10.0, -0.9510565162 } { M_PI * -9.0 / 10.0, -0.9510565162951535 }
}; };
return helper_dtod_inexact("Cos", SDL_cos, precision_cases, SDL_arraysize(precision_cases)); return helper_dtod_inexact("Cos", SDL_cos, precision_cases, SDL_arraysize(precision_cases));
} }
@ -2101,23 +2116,23 @@ static int
sin_precisionTest(void *args) sin_precisionTest(void *args)
{ {
const d_to_d precision_cases[] = { const d_to_d precision_cases[] = {
{ M_PI * 1.0 / 10.0, 0.3090169943 }, { M_PI * 1.0 / 10.0, 0.3090169943749474 },
{ M_PI * 2.0 / 10.0, 0.5877852522 }, { M_PI * 2.0 / 10.0, 0.5877852522924731 },
{ M_PI * 3.0 / 10.0, 0.8090169943 }, { M_PI * 3.0 / 10.0, 0.8090169943749475 },
{ M_PI * 4.0 / 10.0, 0.9510565162 }, { M_PI * 4.0 / 10.0, 0.9510565162951535 },
{ M_PI * 6.0 / 10.0, 0.9510565162 }, { M_PI * 6.0 / 10.0, 0.9510565162951536 },
{ M_PI * 7.0 / 10.0, 0.8090169943 }, { M_PI * 7.0 / 10.0, 0.8090169943749475 },
{ M_PI * 8.0 / 10.0, 0.5877852522 }, { M_PI * 8.0 / 10.0, 0.5877852522924732 },
{ M_PI * 9.0 / 10.0, 0.3090169943 }, { M_PI * 9.0 / 10.0, 0.3090169943749475 },
{ M_PI, 0.0 }, { M_PI, 0.0 },
{ M_PI * -1.0 / 10.0, -0.3090169943 }, { M_PI * -1.0 / 10.0, -0.3090169943749474 },
{ M_PI * -2.0 / 10.0, -0.5877852522 }, { M_PI * -2.0 / 10.0, -0.5877852522924731 },
{ M_PI * -3.0 / 10.0, -0.8090169943 }, { M_PI * -3.0 / 10.0, -0.8090169943749475 },
{ M_PI * -4.0 / 10.0, -0.9510565162 }, { M_PI * -4.0 / 10.0, -0.9510565162951535 },
{ M_PI * -6.0 / 10.0, -0.9510565162 }, { M_PI * -6.0 / 10.0, -0.9510565162951536 },
{ M_PI * -7.0 / 10.0, -0.8090169943 }, { M_PI * -7.0 / 10.0, -0.8090169943749475 },
{ M_PI * -8.0 / 10.0, -0.5877852522 }, { M_PI * -8.0 / 10.0, -0.5877852522924732 },
{ M_PI * -9.0 / 10.0, -0.3090169943 }, { M_PI * -9.0 / 10.0, -0.3090169943749475 },
{ -M_PI, 0.0 }, { -M_PI, 0.0 },
}; };
return helper_dtod_inexact("Sin", SDL_sin, precision_cases, SDL_arraysize(precision_cases)); return helper_dtod_inexact("Sin", SDL_sin, precision_cases, SDL_arraysize(precision_cases));
@ -2217,26 +2232,26 @@ static int
tan_precisionTest(void *args) tan_precisionTest(void *args)
{ {
const d_to_d precision_cases[] = { const d_to_d precision_cases[] = {
{ M_PI * 1.0 / 11.0, 0.2936264929 }, { M_PI * 1.0 / 11.0, 0.29362649293836673 },
{ M_PI * 2.0 / 11.0, 0.6426609771 }, { M_PI * 2.0 / 11.0, 0.642660977168331 },
{ M_PI * 3.0 / 11.0, 1.1540615205 }, { M_PI * 3.0 / 11.0, 1.1540615205330094 },
{ M_PI * 4.0 / 11.0, 2.1896945629 }, { M_PI * 4.0 / 11.0, 2.189694562989681 },
{ M_PI * 5.0 / 11.0, 6.9551527717 }, { M_PI * 5.0 / 11.0, 6.9551527717734745 },
{ M_PI * 6.0 / 11.0, -6.9551527717 }, { M_PI * 6.0 / 11.0, -6.955152771773481 },
{ M_PI * 7.0 / 11.0, -2.1896945629 }, { M_PI * 7.0 / 11.0, -2.189694562989682 },
{ M_PI * 8.0 / 11.0, -1.1540615205 }, { M_PI * 8.0 / 11.0, -1.1540615205330096 },
{ M_PI * 9.0 / 11.0, -0.6426609771 }, { M_PI * 9.0 / 11.0, -0.6426609771683314 },
{ M_PI * 10.0 / 11.0, -0.2936264929 }, { M_PI * 10.0 / 11.0, -0.2936264929383667 },
{ M_PI * -1.0 / 11.0, -0.2936264929 }, { M_PI * -1.0 / 11.0, -0.29362649293836673 },
{ M_PI * -2.0 / 11.0, -0.6426609771 }, { M_PI * -2.0 / 11.0, -0.642660977168331 },
{ M_PI * -3.0 / 11.0, -1.1540615205 }, { M_PI * -3.0 / 11.0, -1.1540615205330094 },
{ M_PI * -4.0 / 11.0, -2.1896945629 }, { M_PI * -4.0 / 11.0, -2.189694562989681 },
{ M_PI * -5.0 / 11.0, -6.9551527717 }, { M_PI * -5.0 / 11.0, -6.9551527717734745 },
{ M_PI * -6.0 / 11.0, 6.9551527717 }, { M_PI * -6.0 / 11.0, 6.955152771773481 },
{ M_PI * -7.0 / 11.0, 2.1896945629 }, { M_PI * -7.0 / 11.0, 2.189694562989682 },
{ M_PI * -8.0 / 11.0, 1.1540615205 }, { M_PI * -8.0 / 11.0, 1.1540615205330096 },
{ M_PI * -9.0 / 11.0, 0.6426609771 }, { M_PI * -9.0 / 11.0, 0.6426609771683314 },
{ M_PI * -10.0 / 11.0, 0.2936264929 } { M_PI * -10.0 / 11.0, 0.2936264929383667 }
}; };
return helper_dtod_inexact("Tan", SDL_tan, precision_cases, SDL_arraysize(precision_cases)); return helper_dtod_inexact("Tan", SDL_tan, precision_cases, SDL_arraysize(precision_cases));
} }
@ -2401,26 +2416,26 @@ static int
asin_precisionTest(void *args) asin_precisionTest(void *args)
{ {
const d_to_d precision_cases[] = { const d_to_d precision_cases[] = {
{ 0.9, 1.1197695149 }, { 0.9, 1.1197695149986342 },
{ 0.8, 0.9272952180 }, { 0.8, 0.9272952180016123 },
{ 0.7, 0.7753974966 }, { 0.7, 0.775397496610753 },
{ 0.6, 0.6435011087 }, { 0.6, 0.6435011087932844 },
{ 0.5, 0.5235987755 }, { 0.5, 0.5235987755982989 },
{ 0.4, 0.4115168460 }, { 0.4, 0.41151684606748806 },
{ 0.3, 0.3046926540 }, { 0.3, 0.3046926540153976 },
{ 0.2, 0.2013579207 }, { 0.2, 0.20135792079033074 },
{ 0.1, 0.1001674211 }, { 0.1, 0.10016742116155977 },
{ 0.0, 0.0 }, { 0.0, 0.0 },
{ -0.0, -0.0 }, { -0.0, -0.0 },
{ -0.1, -0.1001674211 }, { -0.1, -0.10016742116155977 },
{ -0.2, -0.2013579207 }, { -0.2, -0.20135792079033074 },
{ -0.3, -0.3046926540 }, { -0.3, -0.3046926540153976 },
{ -0.4, -0.4115168460 }, { -0.4, -0.41151684606748806 },
{ -0.5, -0.5235987755 }, { -0.5, -0.5235987755982989 },
{ -0.6, -0.6435011087 }, { -0.6, -0.6435011087932844 },
{ -0.7, -0.7753974966 }, { -0.7, -0.775397496610753 },
{ -0.8, -0.9272952180 }, { -0.8, -0.9272952180016123 },
{ -0.9, -1.1197695149 } { -0.9, -1.1197695149986342 }
}; };
return helper_dtod_inexact("Asin", SDL_asin, precision_cases, SDL_arraysize(precision_cases)); return helper_dtod_inexact("Asin", SDL_asin, precision_cases, SDL_arraysize(precision_cases));
} }
@ -2495,24 +2510,24 @@ static int
atan_precisionTest(void *args) atan_precisionTest(void *args)
{ {
const d_to_d precision_cases[] = { const d_to_d precision_cases[] = {
{ 6.313751514675041, 1.4137166941 }, { 6.313751514675041, 1.413716694115407 },
{ 3.0776835371752527, 1.2566370614 }, { 3.0776835371752527, 1.2566370614359172 },
{ 1.9626105055051504, 1.0995574287 }, { 1.9626105055051504, 1.0995574287564276 },
{ 1.3763819204711734, 0.9424777960 }, { 1.3763819204711734, 0.9424777960769379 },
{ 1.0, 0.7853981633 }, { 1.0, 0.7853981633974483 },
{ 0.7265425280053609, 0.6283185307 }, { 0.7265425280053609, 0.6283185307179586 },
{ 0.5095254494944288, 0.4712388980 }, { 0.5095254494944288, 0.47123889803846897 },
{ 0.3249196962329063, 0.3141592653 }, { 0.3249196962329063, 0.3141592653589793 },
{ 0.15838444032453627, 0.1570796326 }, { 0.15838444032453627, 0.15707963267948966 },
{ -0.15838444032453627, -0.1570796326 }, { -0.15838444032453627, -0.15707963267948966 },
{ -0.3249196962329063, -0.3141592653 }, { -0.3249196962329063, -0.3141592653589793 },
{ -0.5095254494944288, -0.4712388980 }, { -0.5095254494944288, -0.47123889803846897 },
{ -0.7265425280053609, -0.6283185307 }, { -0.7265425280053609, -0.6283185307179586 },
{ -1.0, -0.7853981633 }, { -1.0, -0.7853981633974483 },
{ -1.3763819204711734, -0.9424777960 }, { -1.3763819204711734, -0.9424777960769379 },
{ -1.9626105055051504, -1.0995574287 }, { -1.9626105055051504, -1.0995574287564276 },
{ -3.0776835371752527, -1.2566370614 }, { -3.0776835371752527, -1.2566370614359172 },
{ -6.313751514675041, -1.4137166941 }, { -6.313751514675041, -1.413716694115407 },
}; };
return helper_dtod_inexact("Atan", SDL_atan, precision_cases, SDL_arraysize(precision_cases)); return helper_dtod_inexact("Atan", SDL_atan, precision_cases, SDL_arraysize(precision_cases));
} }