END_TEST START_TEST(test_vec_cmp) { /* Putting it first because it's useful for the other tests */ vec3d v1 = {1., 2., 3.}, v2 = {4., 5., 6.}; fail_unless(vec_cmp(v1, v1)); fail_if(vec_cmp(v1, v2)); }
END_TEST START_TEST(test_cross) { vec3d v1 = {1., 0., 0.}, v2 = {0., 1., 0.}, res = {0., 0., 1.}, out; vec_cross(v1, v2, out); fail_unless(vec_cmp(out, res)); /* parallel vectors cross = 0 */ res[2] = 0; vec_cross(v1, v1, out); fail_unless(vec_cmp(out, res)); }
END_TEST START_TEST(test_vec_set) { vec3d res = {1., 2., 3.}, dest; vec_set(dest, 1., 2., 3.); fail_unless(vec_cmp(dest, res)); }
END_TEST START_TEST(test_vec_add) { vec3d vec1 = {1., 2., 3.}, res = {4., 5., 6.}, vec2 = {3., 3., 3.}, out; vec_add(vec1, vec2, out); fail_unless(vec_cmp(out, res)); }
END_TEST START_TEST(test_vec_subt) { vec3d sub = {1., 2., 3.}, from = {4., 5., 6.}, res = {3., 3., 3.}, out; vec_subt(from, sub, out); fail_unless(vec_cmp(out, res)); }
END_TEST START_TEST(test_vec_copy) { vec3d src = {1., 2., 3.}, dst; vec_copy(dst, src); fail_unless(vec_cmp(dst, src)); }
END_TEST START_TEST(test_scalar_mul) { vec3d v1 = {1., 2., 3.}, v2 = {4., 8., 12.}, out; vec_scalar_mul(v1, 4., out); fail_unless(vec_cmp(out, v2)); }
void mod_on_help_unsigned(small_type &us, int unb, int und, sc_digit *ud, int /* vnb */, int vnd, const sc_digit *vd) { #define COPY_DIGITS copy_digits_unsigned { // Body of mod_on_help int old_und = und; und = vec_skip_leading_zeros(und, ud); vnd = vec_skip_leading_zeros(vnd, vd); int cmp_res = vec_cmp(und, ud, vnd, vd); // u < v => u % v = u - case 4 if (cmp_res < 0) return; // u = v => u % v = 0 - case 3 if (cmp_res == 0) { us = SC_ZERO; vec_zero(old_und, ud); return; } // else if u > v - case 5 sc_digit vd0 = (*vd); if ((vnd == 1) && (vd0 == 1)) { us = SC_ZERO; vec_zero(old_und, ud); return; } // One extra digit for d is allocated to simplify vec_div_*(). int nd = sc_max(und, vnd) + 1; #ifdef SC_MAX_NBITS sc_digit d[MAX_NDIGITS + 1]; #else sc_digit *d = new sc_digit[nd]; #endif vec_zero(nd, d); if ((vnd == 1) && (und == 1)) d[0] = (*ud) % vd0; if ((vnd == 1) && (vd0 < HALF_DIGIT_RADIX)) d[0] = vec_rem_small(und, ud, vd0); else vec_rem_large(und, ud, vnd, vd, d); us = check_for_zero(us, nd - 1, d); if (us == SC_ZERO) vec_zero(old_und, ud); else COPY_DIGITS(us, unb, old_und, ud, sc_min(unb, vnd), nd - 1, d); #ifndef SC_MAX_NBITS delete [] d; #endif } #undef COPY_DIGITS }
void div_on_help_unsigned(small_type &us, int unb, int und, sc_digit *ud, int vnb, int vnd, const sc_digit *vd) { #define CONVERT_SM_to_2C_to_SM convert_unsigned_SM_to_2C_to_SM #define COPY_DIGITS copy_digits_unsigned { // Body of div_on_help int old_und = und; und = vec_skip_leading_zeros(und, ud); vnd = vec_skip_leading_zeros(vnd, vd); int cmp_res = vec_cmp(und, ud, vnd, vd); if (cmp_res < 0) { // u < v => u / v = 0 - case 4 us = SC_ZERO; vec_zero(old_und, ud); return; } sc_digit vd0 = (*vd); if ((cmp_res > 0) && (vnd == 1) && (vd0 == 1)) { us = CONVERT_SM_to_2C_to_SM(us, unb, old_und, ud); return; } // One extra digit for d is allocated to simplify vec_div_*(). int nd = sc_max(und, vnd) + 1; #ifdef SC_MAX_NBITS sc_digit d[MAX_NDIGITS + 1]; #else sc_digit *d = new sc_digit[nd]; #endif vec_zero(nd, d); // u = v => u / v = 1 - case 3 if (cmp_res == 0) d[0] = 1; else if ((vnd == 1) && (und == 1)) d[0] = (*ud) / vd0; else if ((vnd == 1) && (vd0 < HALF_DIGIT_RADIX)) vec_div_small(und, ud, vd0, d); else vec_div_large(und, ud, vnd, vd, d); COPY_DIGITS(us, unb, old_und, ud, sc_max(unb, vnb), nd - 1, d); #ifndef SC_MAX_NBITS delete [] d; #endif } #undef COPY_DIGITS #undef CONVERT_SM_to_2C_to_SM }