[util] Clean up some ULP errors in tests

The problem with floating point in unit tests is, well, comparisons are
finicky.
This commit is contained in:
Bill Currie 2023-03-25 17:35:14 +09:00 committed by Bill Currie
parent b82174558b
commit 5f6c007c7c
2 changed files with 30 additions and 12 deletions

View file

@ -352,7 +352,7 @@ static struct {
{0, 0, 1, {0, 0, 1,
1, 0, 0, 1, 0, 0,
0, 1, 0}}, 0, 1, 0}},
#if defined(__i686__) && defined(__OPTIMIZE__) #if (defined(__i686__) || defined(__aarch64__)) && defined(__OPTIMIZE__)
// the fp unit carries more precision than a 32-bit float, so // the fp unit carries more precision than a 32-bit float, so
// the close-to-zero errors are different // the close-to-zero errors are different
{{s05, 0.0, 0.0, s05}, {{s05, 0.0, 0.0, s05},

View file

@ -191,7 +191,11 @@ static vec4d_test_t vec4d_tests[] = {
T(crossd, one, up, { 1, -1, 0} ), T(crossd, one, up, { 1, -1, 0} ),
// This one fails when optimizing with -mfma (which is why fma is not // This one fails when optimizing with -mfma (which is why fma is not
// used): ulp errors in z and w // used): ulp errors in z and w
T(crossd, qtest, qtest, {0, 0, 0, 0} ), T(crossd, qtest, qtest, {0, 0, 0, 0},
#if defined(__aarch64__)
{0, 0, -2.1938006966593093e-17, 1.3322676295501878e-17},
#endif
),
T(qmuld, qident, qident, qident ), T(qmuld, qident, qident, qident ),
T(qmuld, qident, right, right ), T(qmuld, qident, right, right ),
@ -213,7 +217,11 @@ static vec4d_test_t vec4d_tests[] = {
T(qmuld, one, { 2, 2, 2, -2 }, { 0, 0, 0, -8 } ), T(qmuld, one, { 2, 2, 2, -2 }, { 0, 0, 0, -8 } ),
// This one fails when optimizing with -mfma (which is why fma is not // This one fails when optimizing with -mfma (which is why fma is not
// used): ulp error in z // used): ulp error in z
T(qmuld, qtest, qtest, {0.768, 0.576, 0, -0.28} ), T(qmuld, qtest, qtest, {0.768, 0.576, 0, -0.28},
#if defined(__aarch64__)
{0, 0, -2.1938006966593093e-17, 0},
#endif
),
// The one vector is not unit (magnitude 2), so using it as a rotation // The one vector is not unit (magnitude 2), so using it as a rotation
// quaternion results in scaling by 4. However, it still has the effect // quaternion results in scaling by 4. However, it still has the effect
@ -316,12 +324,16 @@ static vec4f_test_t vec4f_tests[] = {
T(crossf, one, right, { 0, 1, -1} ), T(crossf, one, right, { 0, 1, -1} ),
T(crossf, one, forward, {-1, 0, 1} ), T(crossf, one, forward, {-1, 0, 1} ),
T(crossf, one, up, { 1, -1, 0} ), T(crossf, one, up, { 1, -1, 0} ),
#ifdef __aarch64__
T(crossf, qtest, qtest, {0, 0, -1.47819534e-09, -1.43051153e-08} ),
#else
#if !defined(__SSE__) && !defined(__OPTIMIZE__) #if !defined(__SSE__) && !defined(__OPTIMIZE__)
// when not optimizing and SSE is not available (but ok when // when not optimizing and SSE is not available (but ok when
// optimizing) // optimizing)
T(crossf, qtest, qtest, {0, 0, -1.47819534e-09, 0} ), T(crossf, qtest, qtest, {0, 0, -1.47819534e-09, 0} ),
#else #else
T(crossf, qtest, qtest, {0, 0, 0, 0} ), T(crossf, qtest, qtest, {0, 0, 0, 0} ),
#endif
#endif #endif
T(qmulf, qident, qident, qident ), T(qmulf, qident, qident, qident ),
@ -343,6 +355,9 @@ static vec4f_test_t vec4f_tests[] = {
T(qmulf, one, one, { 2, 2, 2, -2 } ), T(qmulf, one, one, { 2, 2, 2, -2 } ),
T(qmulf, one, { 2, 2, 2, -2 }, { 0, 0, 0, -8 } ), T(qmulf, one, { 2, 2, 2, -2 }, { 0, 0, 0, -8 } ),
T(qmulf, qtest, qtest, {0.768, 0.576, 0, -0.28}, T(qmulf, qtest, qtest, {0.768, 0.576, 0, -0.28},
#ifdef __aarch64__
{0, 6e-8, -1.47819534e-09, 2.98023224e-08}
#else
#if !defined(__SSE__) && !defined(__OPTIMIZE__) #if !defined(__SSE__) && !defined(__OPTIMIZE__)
// when not optimizing and SSE is not available (but ok when // when not optimizing and SSE is not available (but ok when
// optimizing) // optimizing)
@ -351,6 +366,7 @@ static vec4f_test_t vec4f_tests[] = {
{0, 6e-8, 0, 6e-8} {0, 6e-8, 0, 6e-8}
#else #else
{0, 6e-8, 0, 3e-8} {0, 6e-8, 0, 3e-8}
#endif
#endif #endif
), ),
@ -373,18 +389,18 @@ static vec4f_test_t vec4f_tests[] = {
T(qvmulf, qtest, right, {0.5392, 0.6144, -0.576, 0}, T(qvmulf, qtest, right, {0.5392, 0.6144, -0.576, 0},
{0, -5.9e-8, -6e-8, 0} ), {0, -5.9e-8, -6e-8, 0} ),
T(qvmulf, qtest, forward, {0.6144, 0.1808, 0.768, 0}, T(qvmulf, qtest, forward, {0.6144, 0.1808, 0.768, 0},
#if !defined(__SSE__) && !defined(__OPTIMIZE__) #if !(defined(__SSE__) || defined(__aarch64__)) && !defined(__OPTIMIZE__)
{-5.9e-8, 0, 0, 0} {-5.9e-8, 0, 0, 0}
#elif !defined(__SSE__) #elif !(defined(__SSE__) || defined(__aarch64__))
{-5.9e-8, 3e-8, 0, 0} {-5.9e-8, 3e-8, 0, 0}
#else #else
{-5.9e-8, 1.5e-8, 0, 0} {-5.9e-8, 1.5e-8, 0, 0}
#endif #endif
), ),
T(qvmulf, qtest, up, {0.576, -0.768, -0.28, 0}, T(qvmulf, qtest, up, {0.576, -0.768, -0.28, 0},
#if !defined(__SSE__) && !defined(__OPTIMIZE__) #if !(defined(__SSE__) || defined(__aarch64__)) && !defined(__OPTIMIZE__)
{6e-8, 0, 3e-8, 0} {6e-8, 0, 3e-8, 0}
#elif !defined(__SSE__) #elif !(defined(__SSE__) || defined(__aarch64__))
{6e-8, 0, 6e-8, 0} {6e-8, 0, 6e-8, 0}
#else #else
{6e-8, 0, 3e-8, 0} {6e-8, 0, 3e-8, 0}
@ -393,18 +409,18 @@ static vec4f_test_t vec4f_tests[] = {
T(vqmulf, right, qtest, {0.5392, 0.6144, 0.576, 0}, T(vqmulf, right, qtest, {0.5392, 0.6144, 0.576, 0},
{0, -5.9e-8, 5.9e-8, 0} ), {0, -5.9e-8, 5.9e-8, 0} ),
T(vqmulf, forward, qtest, {0.6144, 0.1808, -0.768, 0}, T(vqmulf, forward, qtest, {0.6144, 0.1808, -0.768, 0},
#if !defined(__SSE__) && !defined(__OPTIMIZE__) #if !(defined(__SSE__) || defined(__aarch64__)) && !defined(__OPTIMIZE__)
{-5.9e-8, 0, 0, 0} {-5.9e-8, 0, 0, 0}
#elif !defined(__SSE__) #elif !(defined(__SSE__) || defined(__aarch64__))
{-5.9e-8, 3e-8, 0, 0} {-5.9e-8, 3e-8, 0, 0}
#else #else
{-5.9e-8, 1.5e-8, 0, 0} {-5.9e-8, 1.5e-8, 0, 0}
#endif #endif
), ),
T(vqmulf, up, qtest, {-0.576, 0.768, -0.28, 0}, T(vqmulf, up, qtest, {-0.576, 0.768, -0.28, 0},
#if !defined(__SSE__) && !defined(__OPTIMIZE__) #if !(defined(__SSE__) || defined(__aarch64__)) && !defined(__OPTIMIZE__)
{-5.9e-8, 0, 3e-8, 0} {-5.9e-8, 0, 3e-8, 0}
#elif !defined(__SSE__) #elif !(defined(__SSE__) || defined(__aarch64__))
{-5.9e-8, 0, 6e-8, 0} {-5.9e-8, 0, 6e-8, 0}
#else #else
{-5.9e-8, 0, 3e-8, 0} {-5.9e-8, 0, 3e-8, 0}
@ -501,6 +517,7 @@ run_vec4d_tests (void)
printf ("E: " VEC4D_FMT "\n", VEC4_EXP(expect)); printf ("E: " VEC4D_FMT "\n", VEC4_EXP(expect));
printf ("e: " VEC4D_FMT "\n", VEC4_EXP(test->expect)); printf ("e: " VEC4D_FMT "\n", VEC4_EXP(test->expect));
printf ("u: " VEC4D_FMT "\n", VEC4_EXP(test->ulp_errors)); printf ("u: " VEC4D_FMT "\n", VEC4_EXP(test->ulp_errors));
printf ("U: " VEC4D_FMT "\n", VEC4_EXP(result - test->expect));
} }
} }
return ret; return ret;
@ -526,6 +543,7 @@ run_vec4f_tests (void)
printf ("E: " VEC4F_FMT "\n", VEC4_EXP(expect)); printf ("E: " VEC4F_FMT "\n", VEC4_EXP(expect));
printf ("e: " VEC4F_FMT "\n", VEC4_EXP(test->expect)); printf ("e: " VEC4F_FMT "\n", VEC4_EXP(test->expect));
printf ("u: " VEC4F_FMT "\n", VEC4_EXP(test->ulp_errors)); printf ("u: " VEC4F_FMT "\n", VEC4_EXP(test->ulp_errors));
printf ("U: " VEC4F_FMT "\n", VEC4_EXP(result - test->expect));
} }
} }
return ret; return ret;