home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / armbob / armbob_1 / ARMBOB / !ArmBob / progs / ArithSqrt < prev    next >
Encoding:
Text File  |  1996-05-17  |  2.0 KB  |  108 lines

  1. /* ArithSqrt
  2.  Standard arithmetical integer square root algorithm
  3. */
  4.  
  5. main()
  6.  {
  7.   local i;
  8.   mode(27);
  9.   print( "Standard arithmetical integer square root algorithm\n\n" );
  10.   print( "                                  -----  ArmBob  -----\n" );
  11.   print( "integer N         rounded €N      sqrt(N)  rdd(sqrt(N))\n" );
  12.   for (i = 1; i < 31; i ++)
  13.    {
  14.     N = (1 << i) - 1;
  15.     r = arithsqrt( N );
  16.     print( "\nN =",format( N,11,3 ));
  17.     print( "    €N =",format( r,6,3 ));
  18.     s = sqrt( 1.0*N ); /* built-in sqrt() */
  19.     t = floor( s + 0.5 );
  20.     print(format( s,12,2 ));
  21.     print(format( t,8,3 ));
  22.    }
  23.    print( "\n" );
  24.  }
  25.  
  26. arithsqrt(b)
  27.  {
  28.    u = b;
  29.    v = 1 << 6;
  30.    n = 3;
  31.    repeat
  32.     {
  33.       u >>= 6;
  34.       if (u != 0)
  35.        { n += 3; v <<= 6; }
  36.     }
  37.    until (u == 0);
  38.    if (n > 15)
  39.     { v = 1 << 30; n = 15; }
  40.    v = 1 << 30; n = 15;
  41.    repeat
  42.     {
  43.       d = u + v;
  44.       u >>= 1;
  45.       if (b >= d) { b -= d; u += v; }
  46.       v >>= 2;
  47.       n --;
  48.     }
  49.    until (n < 0);
  50.    if (b > u) u ++;
  51.    return u;
  52.  }
  53.      
  54. format(n,l,p)
  55. {
  56.   local dec,i,int,neg,s;
  57.   s = "";
  58.   switch (typeof(n))
  59.     {
  60.       case REAL:
  61.         if (neg = (n < 0.0)) n = -n;
  62.         int = floor(n);
  63.         if (neg) s = "-";
  64.         s += int_10(int);
  65.         s += ".";
  66.         dec = n - 1.0*int; 
  67.         for (i = 0; i < p; i ++) dec *= 10.0;
  68.         dec = floor(dec + 0.5);
  69.         d = "";
  70.         for (i = 0;i < p; i ++)
  71.           { d  = '0' + dec%10 + d; dec /= 10; }
  72.         s += d;
  73.         break;
  74.       case INTEGER:
  75.         if (neg = (n < 0)) n = -n;
  76.         if (neg) s = "-";
  77.         s += int_10(n);
  78.         break;
  79.       case STRING:
  80.         s = n;        
  81.         break;
  82.       default:
  83.         s = "first argument not real, integer or string";        
  84.     }
  85.   for (i = l - sizeof(s); i > 0; i --) s = " " + s;
  86.   return s;
  87. }
  88.  
  89. int_10(n)
  90. {
  91.   local s;
  92.   s = "";
  93.   if (n == 0) s = "0";
  94.   else while(n) { s = '0' + n%10 + s; n /= 10; }
  95.   return s;
  96. }
  97.  
  98. vdu(s)
  99.  {
  100.   local out,i;
  101.   out = fopen("rawvdu:","w");
  102.   for(i=0;i<sizeof(s);putc(s[i++],out));
  103.   fclose(out);
  104.  }
  105.  
  106. mode(n)
  107.  { vdu(""+22+n); }
  108.