home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum16.lzh / SOFTWARE / AWK / EXAMPLES / p144 < prev    next >
Text File  |  1991-05-06  |  2KB  |  52 lines

  1. # rpn - reverse-Polish calculator   -   book p.144
  2. #   input : expression in reverse notation
  3. #           ex.: 1 2 + 3 4 + * 5 /
  4. #   output: value of each expression
  5. #   trig funcs do not work with AWK
  6.  
  7. { for (i=1; i<=NF; i++)
  8.     if ($i ~ /^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)$/) {
  9.         stack[++top] = $i
  10.     } else if ($i == "+" && top > 1) {
  11.         stack[top-1] += stack[top]; top--
  12.     } else if ($i == "-" && top > 1) {
  13.         stack[top-1] -= stack[top]; top--
  14.     } else if ($i == "*" && top > 1) {
  15.         stack[top-1] *= stack[top]; top--
  16.     } else if ($i == "/" && top > 1) {
  17.         stack[top-1] /= stack[top]; top--
  18.     } else if ($i == "^" && top > 1) {
  19.         stack[top-1] ^= stack[top]; top--
  20.     } else if ($i == "sin" && top > 0) {
  21.         stack[top] = sin(stack[top])
  22.     } else if ($i == "cos" && top > 0) {
  23.         stack[top] = cos(stack[top])
  24.     } else if ($i == "atan2" && top > 1) {
  25.         stack[top-1] = atan2(stack[top-1], stack[top]); top--
  26.     } else if ($i == "log" && top > 0) {
  27.         stack[top] = log(stack[top])
  28.     } else if ($i == "exp" && top > 0) {
  29.         stack[top] = exp(stack[top])
  30.     } else if ($i == "sqrt" && top > 0) {
  31.         stack[top] = sqrt(stack[top])
  32.     } else if ($i == "int" && top > 0) {
  33.         stack[top] = int(stack[top])
  34.     } else if ($i == "pi") { 
  35.         stack[++top] = 3.14159265358979
  36.     } else if ($i in vars) {
  37.         stack[++top] = vars[$i]
  38.     } else if ($i ~ /^[a-zA-Z][a-zA-Z0-9]*=$/ && top > 0) {
  39.         vars[substr($i, 1, length($i)-1)] = stack[top--]
  40.     } else {
  41.         print("error: cannot evaluate %s\n", $i)
  42.         top = 0
  43.         next
  44.     }
  45. if (top == 1 && $NF !~ /\=$/)
  46.     printf("\t%.8g\n", stack[top--])
  47. else if (top > 1) {
  48.     printf("error: too many operands\n")
  49.     top = 0
  50.     }
  51. }
  52.