circexp.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Change circular functions to exponentials
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. void
  5. eval_circexp(void)
  6. {
  7. push(cadr(p1));
  8. eval();
  9. circexp();
  10. // normalize
  11. eval();
  12. }
  13. void
  14. circexp(void)
  15. {
  16. int i, h;
  17. save();
  18. p1 = pop();
  19. if (car(p1) == symbol(COS)) {
  20. push(cadr(p1));
  21. expcos();
  22. restore();
  23. return;
  24. }
  25. if (car(p1) == symbol(SIN)) {
  26. push(cadr(p1));
  27. expsin();
  28. restore();
  29. return;
  30. }
  31. if (car(p1) == symbol(TAN)) {
  32. p1 = cadr(p1);
  33. push(imaginaryunit);
  34. push(p1);
  35. multiply();
  36. exponential();
  37. p2 = pop();
  38. push(imaginaryunit);
  39. push(p1);
  40. multiply();
  41. negate();
  42. exponential();
  43. p3 = pop();
  44. push(p3);
  45. push(p2);
  46. subtract();
  47. push(imaginaryunit);
  48. multiply();
  49. push(p2);
  50. push(p3);
  51. add();
  52. divide();
  53. restore();
  54. return;
  55. }
  56. if (car(p1) == symbol(COSH)) {
  57. p1 = cadr(p1);
  58. push(p1);
  59. exponential();
  60. push(p1);
  61. negate();
  62. exponential();
  63. add();
  64. push_rational(1, 2);
  65. multiply();
  66. restore();
  67. return;
  68. }
  69. if (car(p1) == symbol(SINH)) {
  70. p1 = cadr(p1);
  71. push(p1);
  72. exponential();
  73. push(p1);
  74. negate();
  75. exponential();
  76. subtract();
  77. push_rational(1, 2);
  78. multiply();
  79. restore();
  80. return;
  81. }
  82. if (car(p1) == symbol(TANH)) {
  83. p1 = cadr(p1);
  84. push(p1);
  85. push_integer(2);
  86. multiply();
  87. exponential();
  88. p1 = pop();
  89. push(p1);
  90. push_integer(1);
  91. subtract();
  92. push(p1);
  93. push_integer(1);
  94. add();
  95. divide();
  96. restore();
  97. return;
  98. }
  99. if (iscons(p1)) {
  100. h = tos;
  101. while (iscons(p1)) {
  102. push(car(p1));
  103. circexp();
  104. p1 = cdr(p1);
  105. }
  106. list(tos - h);
  107. restore();
  108. return;
  109. }
  110. if (p1->k == TENSOR) {
  111. push(p1);
  112. copy_tensor();
  113. p1 = pop();
  114. for (i = 0; i < p1->u.tensor->nelem; i++) {
  115. push(p1->u.tensor->elem[i]);
  116. circexp();
  117. p1->u.tensor->elem[i] = pop();
  118. }
  119. push(p1);
  120. restore();
  121. return;
  122. }
  123. push(p1);
  124. restore();
  125. }