Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / rect.cpp
blob310e3e89479a726c1d33ed271719f720bb21e6de
1 /* Convert complex z to rectangular form
3 Input: push z
5 Output: Result on stack
6 */
8 #include "stdafx.h"
9 #include "defs.h"
11 void
12 eval_rect(void)
14 push(cadr(p1));
15 eval();
16 rect();
19 void
20 rect(void)
22 save();
23 p1 = pop();
24 if (car(p1) == symbol(ADD)) {
25 push_integer(0);
26 p1 = cdr(p1);
27 while (iscons(p1)) {
28 push(car(p1));
29 rect();
30 add();
31 p1 = cdr(p1);
33 } else {
34 push(p1); // mag(z) * (cos(arg(z)) + i sin(arg(z)))
35 mag();
36 push(p1);
37 arg();
38 p1 = pop();
39 push(p1);
40 cosine();
41 push(imaginaryunit);
42 push(p1);
43 sine();
44 multiply();
45 add();
46 multiply();
48 restore();
51 #if SELFTEST
53 static char *s[] = {
55 "rect(a+i*b)",
56 "a+i*b",
58 "rect(exp(a+i*b))",
59 "i*exp(a)*sin(b)+exp(a)*cos(b)",
61 "rect(1+exp(i*pi/3))",
62 "3/2+1/2*i*3^(1/2)",
64 "z=(a+b*i)/(c+d*i)",
65 "",
67 "rect(z)-real(z)-i*imag(z)",
68 "0",
70 "z=quote(z)",
71 "",
74 void
75 test_rect(void)
77 test(__FILE__, s, sizeof s / sizeof (char *));
80 #endif