79 lines
1.6 KiB
CoffeeScript
79 lines
1.6 KiB
CoffeeScript
###
|
|
Convert complex z to clock form
|
|
|
|
Input: push z
|
|
|
|
Output: Result on stack
|
|
|
|
clock(z) = abs(z) * (-1) ^ (arg(z) / pi)
|
|
|
|
For example, clock(exp(i pi/3)) gives the result (-1)^(1/3)
|
|
###
|
|
|
|
# P.S. I couldn't find independent definition/aknowledgment
|
|
# of the naming "clock form" anywhere on the web, seems like a
|
|
# naming specific to eigenmath.
|
|
# Clock form is another way to express a complex number, and
|
|
# it has three advantages
|
|
# 1) it's uniform with how for example
|
|
# i is expressed i.e. (-1)^(1/2)
|
|
# 2) it's very compact
|
|
# 3) it's a straighforward notation for roots of 1 and -1
|
|
|
|
|
|
DEBUG_CLOCKFORM = false
|
|
|
|
Eval_clock = ->
|
|
push(cadr(p1))
|
|
Eval()
|
|
clockform()
|
|
|
|
clockform = ->
|
|
save()
|
|
#if 1
|
|
p1 = pop()
|
|
push(p1)
|
|
abs()
|
|
if DEBUG_CLOCKFORM then console.log "clockform: abs of " + p1 + " : " + stack[tos-1]
|
|
|
|
# pushing the expression (-1)^... but note
|
|
# that we can't use "power", as "power" evaluates
|
|
# clock forms into rectangular form (see "-1 ^ rational"
|
|
# section in power)
|
|
push_symbol(POWER)
|
|
|
|
push_integer(-1)
|
|
|
|
push(p1)
|
|
arg()
|
|
if DEBUG_CLOCKFORM then console.log "clockform: arg of " + p1 + " : " + stack[tos-1]
|
|
if evaluatingAsFloats
|
|
push_double(Math.PI)
|
|
else
|
|
push(symbol(PI))
|
|
divide()
|
|
if DEBUG_CLOCKFORM then console.log "clockform: divide : " + stack[tos-1]
|
|
list(3)
|
|
|
|
if DEBUG_CLOCKFORM then console.log "clockform: power : " + stack[tos-1]
|
|
multiply()
|
|
if DEBUG_CLOCKFORM then console.log "clockform: multiply : " + stack[tos-1]
|
|
#else
|
|
###
|
|
p1 = pop()
|
|
push(p1)
|
|
abs()
|
|
push(symbol(E))
|
|
push(p1)
|
|
arg()
|
|
push(imaginaryunit)
|
|
multiply()
|
|
power()
|
|
multiply()
|
|
###
|
|
#endif
|
|
restore()
|
|
|
|
|
|
|