Exemplo n.º 1
0
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));
}
Exemplo n.º 2
0
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));
}
Exemplo n.º 3
0
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));
}
Exemplo n.º 4
0
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));
}
Exemplo n.º 5
0
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));
}
Exemplo n.º 6
0
END_TEST

START_TEST(test_vec_copy)
{
    vec3d src = {1., 2., 3.}, dst;
    vec_copy(dst, src);

    fail_unless(vec_cmp(dst, src));
}
Exemplo n.º 7
0
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));
}
Exemplo n.º 8
0
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
  
}
Exemplo n.º 9
0
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

}