#include int main() { /* 2d */ { double2 a = {1.0, 2.0}; double2 b = {3.0, 4.0}; double2 n = {0.0, 1.0}; double2 v; v = un_m_add2d(a, b); assert(fabs(v.x - 4.0) < EPSILON); assert(fabs(v.y - 6.0) < EPSILON); v = un_m_sub2d(a, b); assert(fabs(v.x + 2.0) < EPSILON); assert(fabs(v.y + 2.0) < EPSILON); v = un_m_add_scalar2d(a, 1); assert(fabs(v.x - 2.0) < EPSILON); assert(fabs(v.y - 3.0) < EPSILON); v = un_m_sub_scalar2d(a, 1); assert(fabs(v.x) < EPSILON); assert(fabs(v.y - 1.0) < EPSILON); v = un_m_mul_scalar2d(a, 2); assert(fabs(v.x - 2.0) < EPSILON); assert(fabs(v.y - 4.0) < EPSILON); v = un_m_div_scalar2d(a, 2); assert(fabs(v.x - 0.5) < EPSILON); assert(fabs(v.y - 1.0) < EPSILON); v.x = un_m_dot2d(a, b); assert(fabs(v.x - 11.0) < EPSILON); v = un_m_hadamard2d(a, b); assert(fabs(v.x - 3.0) < EPSILON); assert(fabs(v.y - 8.0) < EPSILON); v = un_m_project2d(a, b); assert(fabs(v.x - 1.32) < EPSILON); assert(fabs(v.y - 1.76) < EPSILON); v = un_m_cross2d(a); assert(fabs(v.x - 2.0) < EPSILON); assert(fabs(v.y + 1.0) < EPSILON); v.x = un_m_magnitude2d(b); assert(fabs(v.x - 5.0) < EPSILON); v.x = un_m_magnitude_sqr2d(b); assert(fabs(v.x - 25.0) < EPSILON); v.x = un_m_distance2d(a, b); assert(fabs(v.x - sqrt(8.0)) < EPSILON); v.x = un_m_distance_sqr2d(a, b); assert(fabs(v.x - 8.0) < EPSILON); v = un_m_normalize2d(b); assert(fabs(v.x - 0.6) < EPSILON); assert(fabs(v.y - 0.8) < EPSILON); v = un_m_reflect2d(a, n); assert(fabs(v.x + a.x) < EPSILON); assert(fabs(v.y - a.y) < EPSILON); } /* 3d */ { double3 a = {1.0, 2.0, 3.0}; double3 b = {3.0, 4.0, 5.0}; double3 n = {0.0, 1.0, 0.0}; double3 v; v = un_m_add3d(a, b); assert(fabs(v.x - 4.0) < EPSILON); assert(fabs(v.y - 6.0) < EPSILON); assert(fabs(v.z - 8.0) < EPSILON); v = un_m_sub3d(a, b); assert(fabs(v.x + 2.0) < EPSILON); assert(fabs(v.y + 2.0) < EPSILON); assert(fabs(v.z + 2.0) < EPSILON); v = un_m_add_scalar3d(a, 1); assert(fabs(v.x - 2.0) < EPSILON); assert(fabs(v.y - 3.0) < EPSILON); assert(fabs(v.z - 4.0) < EPSILON); v = un_m_sub_scalar3d(a, 1); assert(fabs(v.x) < EPSILON); assert(fabs(v.y - 1.0) < EPSILON); assert(fabs(v.z - 2.0) < EPSILON); v = un_m_mul_scalar3d(a, 2); assert(fabs(v.x - 2.0) < EPSILON); assert(fabs(v.y - 4.0) < EPSILON); assert(fabs(v.z - 6.0) < EPSILON); v = un_m_div_scalar3d(a, 2); assert(fabs(v.x - 0.5) < EPSILON); assert(fabs(v.y - 1.0) < EPSILON); assert(fabs(v.z - 1.5) < EPSILON); v.x = un_m_dot3d(a, b); assert(fabs(v.x - 26.0) < EPSILON); v = un_m_hadamard3d(a, b); assert(fabs(v.x - 3.0) < EPSILON); assert(fabs(v.y - 8.0) < EPSILON); assert(fabs(v.z - 15.0) < EPSILON); v = un_m_project3d(a, b); assert(fabs(v.x - 1.56) < EPSILON); assert(fabs(v.y - 2.08) < EPSILON); assert(fabs(v.z - 2.6) < EPSILON); v = un_m_cross3d(a, b); assert(fabs(v.x + 2.0) < EPSILON); assert(fabs(v.y - 4.0) < EPSILON); assert(fabs(v.z + 2.0) < EPSILON); v.x = un_m_magnitude3d(b); assert(fabs(v.x - sqrt(50.0)) < EPSILON); v.x = un_m_magnitude_sqr3d(b); assert(fabs(v.x - 50.0) < EPSILON); v.x = un_m_distance3d(a, b); assert(fabs(v.x - sqrt(12.0)) < EPSILON); v.x = un_m_distance_sqr3d(a, b); assert(fabs(v.x - 12.0) < EPSILON); v = un_m_normalize3d(b); assert(fabs(v.x - 0.424264) < EPSILON); assert(fabs(v.y - 0.565685) < EPSILON); assert(fabs(v.z - 0.707107) < EPSILON); v = un_m_reflect3d(a, n); assert(fabs(v.x + a.x) < EPSILON); assert(fabs(v.y - a.y) < EPSILON); assert(fabs(v.z + a.z) < EPSILON); } /* 4d */ { double4 a = {1.0, 2.0, 3.0, 4.0}; double4 b = {3.0, 4.0, 5.0, 6.0}; double4 n = {0.0, 1.0, 0.0, 0.0}; double4 v; v = un_m_add4d(a, b); assert(fabs(v.x - 4.0) < EPSILON); assert(fabs(v.y - 6.0) < EPSILON); assert(fabs(v.z - 8.0) < EPSILON); assert(fabs(v.w - 10.0) < EPSILON); v = un_m_sub4d(a, b); assert(fabs(v.x + 2.0) < EPSILON); assert(fabs(v.y + 2.0) < EPSILON); assert(fabs(v.z + 2.0) < EPSILON); assert(fabs(v.w + 2.0) < EPSILON); v = un_m_add_scalar4d(a, 1); assert(fabs(v.x - 2.0) < EPSILON); assert(fabs(v.y - 3.0) < EPSILON); assert(fabs(v.z - 4.0) < EPSILON); assert(fabs(v.w - 5.0) < EPSILON); v = un_m_sub_scalar4d(a, 1); assert(fabs(v.x) < EPSILON); assert(fabs(v.y - 1.0) < EPSILON); assert(fabs(v.z - 2.0) < EPSILON); assert(fabs(v.w - 3.0) < EPSILON); v = un_m_mul_scalar4d(a, 2); assert(fabs(v.x - 2.0) < EPSILON); assert(fabs(v.y - 4.0) < EPSILON); assert(fabs(v.z - 6.0) < EPSILON); assert(fabs(v.w - 8.0) < EPSILON); v = un_m_div_scalar4d(a, 2); assert(fabs(v.x - 0.5) < EPSILON); assert(fabs(v.y - 1.0) < EPSILON); assert(fabs(v.z - 1.5) < EPSILON); assert(fabs(v.w - 2.0) < EPSILON); v.x = un_m_dot4d(a, b); assert(fabs(v.x - 50.0) < EPSILON); v = un_m_hadamard4d(a, b); assert(fabs(v.x - 3.0) < EPSILON); assert(fabs(v.y - 8.0) < EPSILON); assert(fabs(v.z - 15.0) < EPSILON); assert(fabs(v.w - 24.0) < EPSILON); v = un_m_project4d(a, b); assert(fabs(v.x - 1.744186) < EPSILON); assert(fabs(v.y - 2.325581) < EPSILON); assert(fabs(v.z - 2.906976) < EPSILON); assert(fabs(v.w - 3.488372) < EPSILON); v.x = un_m_magnitude4d(b); assert(fabs(v.x - sqrt(86.0)) < EPSILON); v.x = un_m_magnitude_sqr4d(b); assert(fabs(v.x - 86.0) < EPSILON); v.x = un_m_distance4d(a, b); assert(fabs(v.x - 4.0) < EPSILON); v.x = un_m_distance_sqr4d(a, b); assert(fabs(v.x - 16.0) < EPSILON); v = un_m_normalize4d(b); assert(fabs(v.x - 0.323498) < EPSILON); assert(fabs(v.y - 0.431331) < EPSILON); assert(fabs(v.z - 0.539164) < EPSILON); assert(fabs(v.w - 0.646997) < EPSILON); v = un_m_reflect4d(a, n); assert(fabs(v.x + a.x) < EPSILON); assert(fabs(v.y - a.y) < EPSILON); assert(fabs(v.z + a.z) < EPSILON); assert(fabs(v.w + a.w) < EPSILON); } { // Complex double2 v; double2 a = { 1, 2 }; double2 b = { 3, 4 }; double2 c = { 1, 0 }; double2 d = { 0, 1 }; v = un_m_complex_addd(a, b); assert((v.x - 4.0) < EPSILON); assert((v.y - 6.0) < EPSILON); v = un_m_complex_subd(a, b); assert((v.x + 2.0) < EPSILON); assert((v.y + 2.0) < EPSILON); v = un_m_complex_muld(a, b); assert((v.x + 5.0) < EPSILON); assert((v.y - 10.0) < EPSILON); v = un_m_complex_divd(c, d); assert(v.x < EPSILON); assert((v.y + 1.0) < EPSILON); v.x = un_m_complex_magnituded(c); assert((v.x - 1.0) < EPSILON); } return 0; }