home *** CD-ROM | disk | FTP | other *** search
- # calc1 - reverse-Polish calculator, version 1
- # input: arithmetic expressions in reverse Polish
- # output: values of expressions
-
- { for (i = 1; i <= NF; i++)
- if ($i ~ /^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)$/) {
- stack[++top] = $i
- } else if ($i == "+" && top > 1) {
- stack[top-1] += stack[top]; top--
- } else if ($i == "-" && top > 1) {
- stack[top-1] -= stack[top]; top--
- } else if ($i == "*" && top > 1) {
- stack[top-1] *= stack[top]; top--
- } else if ($i == "/" && top > 1) {
- stack[top-1] /= stack[top]; top--
- } else if ($i == "^" && top > 1) {
- stack[top-1] ^= stack[top]; top--
- } else {
- printf("error: cannot evaluate %s\n", $i)
- top = 0
- next
- }
- if (top == 1)
- printf("\t%.8g\n", stack[top--])
- else if (top > 1) {
- printf("error: too many operands\n")
- top = 0
- }
- }
-