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 >
Wrap
Text File
|
1991-05-06
|
2KB
|
52 lines
# rpn - reverse-Polish calculator - book p.144
# input : expression in reverse notation
# ex.: 1 2 + 3 4 + * 5 /
# output: value of each expression
# trig funcs do not work with AWK
{ 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 if ($i == "sin" && top > 0) {
stack[top] = sin(stack[top])
} else if ($i == "cos" && top > 0) {
stack[top] = cos(stack[top])
} else if ($i == "atan2" && top > 1) {
stack[top-1] = atan2(stack[top-1], stack[top]); top--
} else if ($i == "log" && top > 0) {
stack[top] = log(stack[top])
} else if ($i == "exp" && top > 0) {
stack[top] = exp(stack[top])
} else if ($i == "sqrt" && top > 0) {
stack[top] = sqrt(stack[top])
} else if ($i == "int" && top > 0) {
stack[top] = int(stack[top])
} else if ($i == "pi") {
stack[++top] = 3.14159265358979
} else if ($i in vars) {
stack[++top] = vars[$i]
} else if ($i ~ /^[a-zA-Z][a-zA-Z0-9]*=$/ && top > 0) {
vars[substr($i, 1, length($i)-1)] = stack[top--]
} else {
print("error: cannot evaluate %s\n", $i)
top = 0
next
}
if (top == 1 && $NF !~ /\=$/)
printf("\t%.8g\n", stack[top--])
else if (top > 1) {
printf("error: too many operands\n")
top = 0
}
}