home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 2 / RISC_DISC_2.iso / pd_share / program / language / bob / !ArmBob / progs / h / power < prev    next >
Encoding:
Text File  |  1995-01-12  |  847 b   |  40 lines

  1. /* exponentiate        GCW  12/01/95
  2.  
  3.    power(x,y) defined if
  4.        #  y is a positive integer
  5.        #  y is a negative integer and x is a nonzero real
  6.        #  y is a real and x is a positive real
  7.    result has same type as x.
  8. */
  9.  
  10. power(x,y)
  11. {
  12.  switch (typeof(y))
  13.  {
  14.   case REAL:
  15.     if (x < 0.0) quit("Positive real argument needed");
  16.     else return (x > 0.0)?(exp(y*log(x))):0.0;
  17.     break;
  18.   case INTEGER:
  19.     switch (typeof(x))
  20.     {
  21.      case REAL:
  22.         return (y < 0)?fastpower(1.0/x,-y):fastpower(x,y);
  23.         break;
  24.      case INTEGER:
  25.         if (y < 0) quit("Positive exponent needed");
  26.         else return fastpower(x,y);
  27.         break;
  28.      }
  29.      break;
  30.  }
  31. }
  32.  
  33. fastpower(x,y)
  34. {
  35.  if (y == 0) return (typeof(x) == REAL)?1.0:1;
  36.  if (y == 1) return x;
  37.  if (y%2) return x*fastpower(x*x,y/2);
  38.  else return fastpower(x*x, y/2);
  39. }
  40.