numerator.cpp 846 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "stdafx.h"
  2. #include "defs.h"
  3. void
  4. eval_numerator(void)
  5. {
  6. push(cadr(p1));
  7. eval();
  8. numerator();
  9. }
  10. void
  11. numerator(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. numerator();
  27. p1 = cdr(p1);
  28. }
  29. multiply_all(tos - h);
  30. } else if (isrational(p1)) {
  31. push(p1);
  32. mp_numerator();
  33. } else if (car(p1) == symbol(POWER) && isnegativeterm(caddr(p1)))
  34. push(one);
  35. else
  36. push(p1);
  37. restore();
  38. }
  39. #if SELFTEST
  40. static char *s[] = {
  41. "numerator(2/3)",
  42. "2",
  43. "numerator(x)",
  44. "x",
  45. "numerator(1/x)",
  46. "1",
  47. "numerator(a+b)",
  48. "a+b",
  49. "numerator(1/a+1/b)",
  50. "a+b",
  51. };
  52. void
  53. test_numerator(void)
  54. {
  55. test(__FILE__, s, sizeof s / sizeof (char *));
  56. }
  57. #endif