46 lines
770 B
CoffeeScript
46 lines
770 B
CoffeeScript
# power function for double precision floating point
|
|
|
|
|
|
|
|
dpow = ->
|
|
a = 0.0
|
|
b = 0.0
|
|
base = 0.0
|
|
expo = 0.0
|
|
result = 0.0
|
|
theta = 0.0
|
|
|
|
expo = pop_double()
|
|
base = pop_double()
|
|
|
|
# divide by zero?
|
|
|
|
if (base == 0.0 && expo < 0.0)
|
|
stop("divide by zero")
|
|
|
|
# nonnegative base or integer power?
|
|
|
|
if (base >= 0.0 || (expo % 1.0) == 0.0)
|
|
result = Math.pow(base, expo)
|
|
push_double(result)
|
|
return
|
|
|
|
result = Math.pow(Math.abs(base), expo)
|
|
|
|
theta = Math.PI * expo
|
|
|
|
# this ensures the real part is 0.0 instead of a tiny fraction
|
|
|
|
if ((expo % 0.5) == 0.0)
|
|
a = 0.0
|
|
b = Math.sin(theta)
|
|
else
|
|
a = Math.cos(theta)
|
|
b = Math.sin(theta)
|
|
|
|
push_double(a * result)
|
|
push_double(b * result)
|
|
push(imaginaryunit)
|
|
multiply()
|
|
add()
|