rect.cpp 946 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /* Convert complex z to rectangular form
  2. Input: push z
  3. Output: Result on stack
  4. */
  5. #include "stdafx.h"
  6. #include "defs.h"
  7. void
  8. eval_rect(void)
  9. {
  10. push(cadr(p1));
  11. eval();
  12. rect();
  13. }
  14. void
  15. rect(void)
  16. {
  17. save();
  18. p1 = pop();
  19. if (car(p1) == symbol(ADD)) {
  20. push_integer(0);
  21. p1 = cdr(p1);
  22. while (iscons(p1)) {
  23. push(car(p1));
  24. rect();
  25. add();
  26. p1 = cdr(p1);
  27. }
  28. } else {
  29. push(p1); // mag(z) * (cos(arg(z)) + i sin(arg(z)))
  30. mag();
  31. push(p1);
  32. arg();
  33. p1 = pop();
  34. push(p1);
  35. cosine();
  36. push(imaginaryunit);
  37. push(p1);
  38. sine();
  39. multiply();
  40. add();
  41. multiply();
  42. }
  43. restore();
  44. }
  45. #if SELFTEST
  46. static char *s[] = {
  47. "rect(a+i*b)",
  48. "a+i*b",
  49. "rect(exp(a+i*b))",
  50. "i*exp(a)*sin(b)+exp(a)*cos(b)",
  51. "rect(1+exp(i*pi/3))",
  52. "3/2+1/2*i*3^(1/2)",
  53. "z=(a+b*i)/(c+d*i)",
  54. "",
  55. "rect(z)-real(z)-i*imag(z)",
  56. "0",
  57. "z=quote(z)",
  58. "",
  59. };
  60. void
  61. test_rect(void)
  62. {
  63. test(__FILE__, s, sizeof s / sizeof (char *));
  64. }
  65. #endif