diff --git a/simgear/math/test_sgvec4.cxx b/simgear/math/test_sgvec4.cxx index e401ece6..b6a1b956 100644 --- a/simgear/math/test_sgvec4.cxx +++ b/simgear/math/test_sgvec4.cxx @@ -4,102 +4,125 @@ #include #include "SGMathFwd.hxx" +#include "SGVec2.hxx" +#include "SGVec3.hxx" #include "SGVec4.hxx" // set to 0 for a timing test -#define TEST_ACCURACY 1 +#define TESTV_ACCURACY 1 -#if TEST_ACCURACY -# define TEST(a, p,q,r,s) \ - if (a[0] != (p) || a[1] != (q) || a[2] != (r) || a[3] != (s)) \ - printf("line: %i, diff: %5.4e, %5.4e, %5.4e, %5.4e\n", __LINE__, \ - std::fabs(a[0]-(p)), \ - std::fabs(a[1]-(q)), \ - std::fabs(a[2]-(r)), \ - std::fabs(a[3]-(s))); +#define N 4 +#define T double +#if TESTV_ACCURACY +# define TESTF(a, b) \ + if ( std::abs(a - b) > T(1e-7) ) \ + printf("line: %i, diff: %5.4e\n", __LINE__, double(std::abs(a - b))); +# define TESTV(a, p,q,r,s) \ + if ( std::abs(a[0] - (p)) > T(1e-7) \ + || std::abs(a[1] - (q)) > T(1e-7) \ + || (N > 2 && std::abs(a[2] - (r)) > T(1e-7)) \ + || (N > 3 && std::abs(a[3] - (s)) > T(1e-7)) \ + ) \ + printf("line: %i, diff: %5.4e, %5.4e, %5.4e, %5.4e\n", __LINE__, double(std::abs(a[0]-(p))), double(std::abs(a[1]-(q))), double(std::abs(a[2]-(r))), double(std::abs(a[3]-(s)))); # define MAX 1 #else -# define TEST(a, p,q,r,s) +# define TESTF(a, b) +# define TESTV(a, p,q,r,s) # define MAX 1000000 #endif -#define T double +#define _VEC(NSTR) SGVec ## NSTR +#define VEC(N) _VEC(N) int main() { - T p[4] = { 1.03, 0.55, 0.707, -0.01 }; - const SGVec4 q( 0.31, 0.43, 0.69, 1.0 ); - float res = 0.0f; + T init[4] = { T(1.31), T(3.43), T(5.69), T(1.0) }; + T p[4] = { T(1.03), T(3.55), T(2.707), T(-4.01) }; + float res = 0; long int i; + VEC(N) q; + + for (int i=0; i qq, rr(T(-2.31), T(3.43), T(-4.69), T(-1.0)); + TESTV(rr, T(-2.31), T(3.43), T(-4.69), T(-1.0)); + + qq = simd4::min(rr, simd4_t(T(0))); + TESTV(qq, T(-2.31), 0, T(-4.69), T(-1.00)); + + qq = simd4::max(rr, simd4_t(0.0)); + TESTV(qq, 0, T(3.43), 0, 0); + + qq = simd4::abs(rr); + TESTV(qq, T(2.31), T(3.43), T(4.69), T(1.00)); for (i=0; i v(p); - SGVec4 x(v), y(v); + VEC(N) v(p); + VEC(N) x(v), y(v); T f, g; - TEST(x, p[0], p[1], p[2], p[3]); + TESTV(x, p[0], p[1], p[2], p[3]); + TESTV(y, p[0], p[1], p[2], p[3]); x += q; - TEST(x, p[0]+q[0], p[1]+q[1], p[2]+q[2], p[3]+q[3]); + TESTV(x, p[0]+q[0], p[1]+q[1], p[2]+q[2], p[3]+q[3]); y -= q; - TEST(y, p[0]-q[0], p[1]-q[1], p[2]-q[2], p[3]-q[3]); + TESTV(y, p[0]-q[0], p[1]-q[1], p[2]-q[2], p[3]-q[3]); - v = x; x *= 1.7; - TEST(x, v[0]*1.7, v[1]*1.7, v[2]*1.7, v[3]*1.7); + v = x; x *= T(1.7); + TESTV(x, v[0]*T(1.7), v[1]*T(1.7), v[2]*T(1.7), v[3]*T(1.7)); - v = y; y /= -.3; - TEST(y, v[0]/-.3, v[1]/-.3, v[2]/-.3, v[3]/-.3); + v = y; y /= T(-1.3); + TESTV(y, v[0]/T(-1.3), v[1]/T(-1.3), v[2]/T(-1.3), v[3]/T(-1.3)); v = +x; - TEST(v, x[0], x[1], x[2], x[3]); + TESTV(v, x[0], x[1], x[2], x[3]); v = -x; - TEST(v, -x[0], -x[1], -x[2], -x[3]); + TESTV(v, -x[0], -x[1], -x[2], -x[3]); v = y+x; - TEST(v, y[0]+x[0], y[1]+x[1], y[2]+x[2], y[3]+x[3]); + TESTV(v, y[0]+x[0], y[1]+x[1], y[2]+x[2], y[3]+x[3]); - y = v*1.7; - TEST(y, v[0]*1.7, v[1]*1.7, v[2]*1.7, v[3]*1.7); + y = v*T(1.7); + TESTV(y, v[0]*T(1.7), v[1]*T(1.7), v[2]*T(1.7), v[3]*T(1.7)); - y = 1.7*v; - TEST(y, v[0]*1.7, v[1]*1.7, v[2]*1.7, v[3]*1.7); + y = T(1.7)*v; + TESTV(y, v[0]*T(1.7), v[1]*T(1.7), v[2]*T(1.7), v[3]*T(1.7)); v = y-x; - TEST(v, y[0]-x[0], y[1]-x[1], y[2]-x[2], y[3]-x[3]); + TESTV(v, y[0]-x[0], y[1]-x[1], y[2]-x[2], y[3]-x[3]); - f = dot(x, v); - g = (x[0]*v[0] + x[1]*v[1] + x[2]*v[2] + x[3]*v[3]); -#if TEST_ACCURACY - if (f != g) { - printf("line: %i: dot: f: %5.4f, g: %5.4f\n", __LINE__, f, g); - } -#endif + f = norm(v); g = 0; + for (int i=0; i t = x - y; - f = dot(v, v); - g = (t[0]*t[0] + t[1]*t[1] + t[2]*t[2] + t[3]*t[3]); -#if TEST_ACCURACY - if (f != g) { - printf("line: %i: dot: f: %5.4f, g: %5.4f\n", __LINE__, f, g); - } -#endif + VEC(N) t = x - y; + f = norm(v); g = 0; + for (int i=0; i