// Change circular functions to exponentials #include "stdafx.h" #include "defs.h" void eval_circexp(void) { push(cadr(p1)); eval(); circexp(); // normalize eval(); } void circexp(void) { int i, h; save(); p1 = pop(); if (car(p1) == symbol(COS)) { push(cadr(p1)); expcos(); restore(); return; } if (car(p1) == symbol(SIN)) { push(cadr(p1)); expsin(); restore(); return; } if (car(p1) == symbol(TAN)) { p1 = cadr(p1); push(imaginaryunit); push(p1); multiply(); exponential(); p2 = pop(); push(imaginaryunit); push(p1); multiply(); negate(); exponential(); p3 = pop(); push(p3); push(p2); subtract(); push(imaginaryunit); multiply(); push(p2); push(p3); add(); divide(); restore(); return; } if (car(p1) == symbol(COSH)) { p1 = cadr(p1); push(p1); exponential(); push(p1); negate(); exponential(); add(); push_rational(1, 2); multiply(); restore(); return; } if (car(p1) == symbol(SINH)) { p1 = cadr(p1); push(p1); exponential(); push(p1); negate(); exponential(); subtract(); push_rational(1, 2); multiply(); restore(); return; } if (car(p1) == symbol(TANH)) { p1 = cadr(p1); push(p1); push_integer(2); multiply(); exponential(); p1 = pop(); push(p1); push_integer(1); subtract(); push(p1); push_integer(1); add(); divide(); restore(); return; } if (iscons(p1)) { h = tos; while (iscons(p1)) { push(car(p1)); circexp(); p1 = cdr(p1); } list(tos - h); restore(); return; } if (p1->k == TENSOR) { push(p1); copy_tensor(); p1 = pop(); for (i = 0; i < p1->u.tensor->nelem; i++) { push(p1->u.tensor->elem[i]); circexp(); p1->u.tensor->elem[i] = pop(); } push(p1); restore(); return; } push(p1); restore(); }