Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / denominator.cpp
blob213f367c3ab4eaf81806b18e728f7eff7df8a6a8
1 #include "stdafx.h"
2 #include "defs.h"
4 void
5 eval_denominator(void)
7 push(cadr(p1));
8 eval();
9 denominator();
12 void
13 denominator(void)
15 int h;
17 save();
19 p1 = pop();
21 if (car(p1) == symbol(ADD)) {
22 push(p1);
23 rationalize();
24 p1 = pop();
27 if (car(p1) == symbol(MULTIPLY)) {
28 h = tos;
29 p1 = cdr(p1);
30 while (iscons(p1)) {
31 push(car(p1));
32 denominator();
33 p1 = cdr(p1);
35 multiply_all(tos - h);
36 } else if (isrational(p1)) {
37 push(p1);
38 mp_denominator();
39 } else if (car(p1) == symbol(POWER) && isnegativeterm(caddr(p1))) {
40 push(p1);
41 reciprocate();
42 } else
43 push(one);
45 restore();
48 #if SELFTEST
50 static char *s[] = {
52 "denominator(2/3)",
53 "3",
55 "denominator(x)",
56 "1",
58 "denominator(1/x)",
59 "x",
61 "denominator(a+b)",
62 "1",
64 "denominator(1/a+1/b)",
65 "a*b",
67 // denominator function expands
69 "denominator(1/(x-1)/(x-2))",
70 "x^2-3*x+2",
73 void
74 test_denominator(void)
76 test(__FILE__, s, sizeof s / sizeof (char *));
79 #endif