safe_operations<c>& operator *=(safe_operations<c> const& rhs)
	{
		if (!check_mul(value, rhs.value, typename container <c>::tag()))
			throw std::overflow_error("In expression is ovwerflow");
		value *= rhs.value;
		return (*this);
	}
Example #2
0
// 掛け算
int mat_mul(matrix *mat1, matrix mat2, matrix mat3){
  int i, j, k;
  matrix mat2_w, mat3_w;
  
  if(check_mul(*mat1, mat2, mat3) != 0){
    printf("%s\n", "エラーが発生しました。");
    return -1;
  }

  mat_alloc(&mat2_w, mat2.row, mat2.col);
  mat_alloc(&mat3_w, mat3.row, mat3.col);
  mat_copy(&mat2_w, mat2);
  mat_copy(&mat3_w, mat3);
  
  for(i=0; i < mat1->row; i++){
    for(j=0; j < mat1->col; j++){
      mat1->element[i][j] = 0;

      for(k=0; k<mat2_w.col; k++){
        mat1->element[i][j] += mat2_w.element[i][k] * mat3_w.element[k][j];
      }
    }
  }

  mat_free(&mat2_w);
  mat_free(&mat3_w);
  
  return 0;
}
bool mul_zdouble(void)
{	bool ok = true;

	ok &= check_div();
	ok &= check_mul();

	return ok;
}
Example #4
0
int reverse(int x) {
    int ret = 0;
    int sign = 0;
    if (x < 0) {
        if (check(-x, &x)) return 0;
        sign = 1;
    }
    while (x >= 10) {
        if (check_add(ret, x % 10, &ret)) return 0;
        x /= 10;
        if (check_mul(ret, 10, &ret)) return 0;
    }

    if (check_add(ret, x, &ret)) return 0;

    if (sign) 
        if (check(-ret, &ret)) return 0;
    return ret;
}
Example #5
0
void
proto_callback (uint8_t cmd, uint8_t size, uint8_t *args)
{
    uint8_t ap, bp, as, bs;
    uint16_t i;
    int32_t al, bl, rl[4];
    uint32_t patl[] = { 0xa66a6aa6, 0x5a5affff, 0xffcdffcd, 0xffffffff };
#define patn (sizeof (patl) / sizeof (patl[0]))
#define c(cmd, size) (cmd << 8 | size)
    switch (c (cmd, size))
    {
    case c ('z', 0):
        utils_reset ();
        break;
    case c ('m', 0):
        for (ap = 0; ap < patn; ap++)
            for (bp = 0; bp < patn; bp++)
                for (as = 0; as < 32; as++)
                    for (bs = 0; bs < 32; bs++)
                    {
                        al = patl[ap] >> as;
                        bl = patl[bp] >> bs;
                        proto_send2d ('a', al, bl);
                        rl[0] = fixed_mul_f824 (al, bl);
                        check_mul (al, bl, rl[0]);
                        rl[1] = fixed_mul_f824 (-al, bl);
                        check_mul (-al, bl, rl[1]);
                        rl[2] = fixed_mul_f824 (al, -bl);
                        check_mul (al, -bl, rl[2]);
                        rl[3] = fixed_mul_f824 (-al, -bl);
                        check_mul (-al, -bl, rl[3]);
                        proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
                    }
        for (i = 0; i < 64000; i++)
        {
            al = random_u32 ();
            bl = random_u32 ();
            proto_send2d ('a', al, bl);
            rl[0] = fixed_mul_f824 (al, bl);
            check_mul (al, bl, rl[0]);
            rl[1] = fixed_mul_f824 (-al, bl);
            check_mul (-al, bl, rl[1]);
            rl[2] = fixed_mul_f824 (al, -bl);
            check_mul (al, -bl, rl[2]);
            rl[3] = fixed_mul_f824 (-al, -bl);
            check_mul (-al, -bl, rl[3]);
            proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
        }
        break;
    case c ('d', 0):
        for (ap = 0; ap < patn; ap++)
            for (bp = 0; bp < patn; bp++)
                for (as = 0; as < 32; as++)
                    for (bs = 0; bs < 31; bs++)
                    {
                        al = patl[ap] >> as;
                        bl = patl[bp] >> bs;
                        proto_send2d ('a', al, bl);
                        rl[0] = fixed_div_f824 (al, bl);
                        check_div (al, bl, rl[0]);
                        rl[1] = fixed_div_f824 (-al, bl);
                        check_div (-al, bl, rl[1]);
                        rl[2] = fixed_div_f824 (al, -bl);
                        check_div (al, -bl, rl[2]);
                        rl[3] = fixed_div_f824 (-al, -bl);
                        check_div (-al, -bl, rl[3]);
                        proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
                    }
        for (i = 0; i < 64000; i++)
        {
            al = random_u32 ();
            bl = random_u32 ();
            if (bl != 0)
            {
                proto_send2d ('a', al, bl);
                rl[0] = fixed_div_f824 (al, bl);
                check_div (al, bl, rl[0]);
                rl[1] = fixed_div_f824 (-al, bl);
                check_div (-al, bl, rl[1]);
                rl[2] = fixed_div_f824 (al, -bl);
                check_div (al, -bl, rl[2]);
                rl[3] = fixed_div_f824 (-al, -bl);
                check_div (-al, -bl, rl[3]);
                proto_send4d ('r', rl[0], rl[1], rl[2], rl[3]);
            }
        }
        break;
    case c ('c', 0):
        for (al = 0; al < (1L << 24); al += 257)
        {
            proto_send1d ('a', al);
            rl[0] = fixed_cos_f824 (al);
            rl[1] = fixed_sin_f824 (al);
            check_cos (al, rl[0], rl[1]);
            proto_send2d ('r', rl[0], rl[1]);
        }
        for (i = 0; i < 64000; i++)
        {
            al = random_u32 () & 0xffffff;
            proto_send1d ('a', al);
            rl[0] = fixed_cos_f824 (al);
            rl[1] = fixed_sin_f824 (al);
            check_cos (al, rl[0], rl[1]);
            proto_send2d ('r', rl[0], rl[1]);
        }
        break;
    case c ('s', 0):
        for (ap = 0; ap < patn; ap++)
            for (as = 0; as < 32; as++)
            {
                al = patl[ap] >> as;
                proto_send1d ('a', al);
                rl[0] = fixed_sqrt_uf248 (al);
                rl[1] = fixed_sqrt_ui32 (al);
                check_sqrt (al, rl[0], rl[1]);
                proto_send2d ('r', rl[0], rl[1]);
            }
        for (i = 0; i < 64000; i++)
        {
            al = random_u32 ();
            proto_send1d ('a', al);
            rl[0] = fixed_sqrt_uf248 (al);
            rl[1] = fixed_sqrt_ui32 (al);
            check_sqrt (al, rl[0], rl[1]);
            proto_send2d ('r', rl[0], rl[1]);
        }
        break;
    default:
        proto_send0 ('?');
        return;
    }
    /* When no error acknoledge. */
    proto_send (cmd, size, args);
#undef c
}