r57shell

Karatsuba test

Apr 10th, 2014
675
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <cstdio>
  2.  
  3. // standard add carry flag calculation
  4. bool add_c(int a, int b)
  5. {
  6.     if ((unsigned int)a > 0xF || (unsigned int)b > 0xF)
  7.         printf("Assertation failed!\n");
  8.     int r = a + b;
  9.     return ((a&0x8)&b)|(((~r)&0x8)&b)|(((~r)&0x8)&a);
  10. }
  11.  
  12. // if you don't belive to previous function, use this
  13. bool add_c1(int a, int b)
  14. {
  15.     if ((unsigned int)a > 0xF || (unsigned int)b > 0xF)
  16.         printf("Assertation failed!\n");
  17.     int r = a + b;
  18.     return r>0xF;
  19. }
  20.  
  21. // simple signed 4.4 fixed point multiplication
  22. int mul(int a, int b)
  23. {
  24.     if ((unsigned int)a > 0xFF || (unsigned int)b > 0xFF)
  25.         printf("Assertation failed!\n");
  26.     return (((int)(char)a*(int)(char)b)>>4)&0xFF;
  27. }
  28.  
  29. // karatsuba test signed 4.4 fixed point multiplication
  30. int mul2(int a, int b)
  31. {
  32.     if ((unsigned int)a > 0xFF || (unsigned int)b > 0xFF)
  33.         printf("Assertation failed!\n");
  34.     int s=1;
  35.     if ((char)a < 0)
  36.     {
  37.         s *= -1;
  38.         a = -(char)a;
  39.     }
  40.     if ((char)b < 0)
  41.     {
  42.         s *= -1;
  43.         b = -(char)b;
  44.     }
  45.     if ((unsigned int)a > 0xFF || (unsigned int)b > 0xFF)
  46.         printf("Assertation failed!\n");
  47.     int z1 = ((a&0xF)*(b&0xF))&0xFF; //mul low
  48.     int z3 = ((a>>4)*(b>>4))&0xFF; // mul high
  49.     int x = ((a>>4)-(a&0xF))*((b>>4)-(b&0xF))&0xFF; // mul :S
  50.     int y = (z1-x)&0xFF;
  51.     int z2 = (y+z3)&0xFF; // z2 now calculated
  52.     int r1 = ((z1>>4)+z2&0xF); // sum low part
  53.     int c = add_c((z1>>4),z2&0xF)?1:0; // check carry
  54.     int r2 = ((z2>>4)+(z3&0xF)+c)&0xF; // sum high part
  55.     int r = (r1)|(r2<<4); // combine result
  56.     if (s == -1) // sign invert
  57.         r = ((~r)+((z1)&0xF?0:1))&0xFF;
  58.     return r; // hurray!
  59. }
  60.  
  61. int main()
  62. {
  63.     for (int a=0; a<0x100; ++a)
  64.         for (int b=0; b<0x100; ++b)
  65.         {
  66.             if (mul(a,b) != mul2(a,b))
  67.                 printf("mul(%02X,%02X)=%02X!=%02X=mul2(%02X,%02X)\n",a,b,mul(a,b),mul2(a,b),a,b);
  68.         }
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment