1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include "stdafx.h"
- #include "defs.h"
- void
- eval_denominator(void)
- {
- push(cadr(p1));
- eval();
- denominator();
- }
- void
- denominator(void)
- {
- int h;
- save();
- p1 = pop();
- if (car(p1) == symbol(ADD)) {
- push(p1);
- rationalize();
- p1 = pop();
- }
- if (car(p1) == symbol(MULTIPLY)) {
- h = tos;
- p1 = cdr(p1);
- while (iscons(p1)) {
- push(car(p1));
- denominator();
- p1 = cdr(p1);
- }
- multiply_all(tos - h);
- } else if (isrational(p1)) {
- push(p1);
- mp_denominator();
- } else if (car(p1) == symbol(POWER) && isnegativeterm(caddr(p1))) {
- push(p1);
- reciprocate();
- } else
- push(one);
- restore();
- }
- #if SELFTEST
- static char *s[] = {
- "denominator(2/3)",
- "3",
- "denominator(x)",
- "1",
- "denominator(1/x)",
- "x",
- "denominator(a+b)",
- "1",
- "denominator(1/a+1/b)",
- "a*b",
- // denominator function expands
- "denominator(1/(x-1)/(x-2))",
- "x^2-3*x+2",
- };
- void
- test_denominator(void)
- {
- test(__FILE__, s, sizeof s / sizeof (char *));
- }
- #endif
|