denominator.cpp 966 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "stdafx.h"
  2. #include "defs.h"
  3. void
  4. eval_denominator(void)
  5. {
  6. push(cadr(p1));
  7. eval();
  8. denominator();
  9. }
  10. void
  11. denominator(void)
  12. {
  13. int h;
  14. save();
  15. p1 = pop();
  16. if (car(p1) == symbol(ADD)) {
  17. push(p1);
  18. rationalize();
  19. p1 = pop();
  20. }
  21. if (car(p1) == symbol(MULTIPLY)) {
  22. h = tos;
  23. p1 = cdr(p1);
  24. while (iscons(p1)) {
  25. push(car(p1));
  26. denominator();
  27. p1 = cdr(p1);
  28. }
  29. multiply_all(tos - h);
  30. } else if (isrational(p1)) {
  31. push(p1);
  32. mp_denominator();
  33. } else if (car(p1) == symbol(POWER) && isnegativeterm(caddr(p1))) {
  34. push(p1);
  35. reciprocate();
  36. } else
  37. push(one);
  38. restore();
  39. }
  40. #if SELFTEST
  41. static char *s[] = {
  42. "denominator(2/3)",
  43. "3",
  44. "denominator(x)",
  45. "1",
  46. "denominator(1/x)",
  47. "x",
  48. "denominator(a+b)",
  49. "1",
  50. "denominator(1/a+1/b)",
  51. "a*b",
  52. // denominator function expands
  53. "denominator(1/(x-1)/(x-2))",
  54. "x^2-3*x+2",
  55. };
  56. void
  57. test_denominator(void)
  58. {
  59. test(__FILE__, s, sizeof s / sizeof (char *));
  60. }
  61. #endif